Нормализация массивов numpy для единичных векторов с помощью Python

Введение

Нормализация — это процесс преобразования данных, который происходит на ранних этапах разработки модели и направлен на изменение формы распределения числовых значений ваших данных. Например, вы можете нормализовать точки числовых данных, чтобы их сумма равнялась 1 и описывалась как распределение вероятностей.

Нормализация данных приносит пользу различным моделям машинного обучения, в частности, тем, которые используют евклидово расстояние.

В сегодняшней статье мы покажем, как нормализовать пустой массив в единичный вектор. Это означает, что мы будем преобразовывать масштаб по величине вектора так, чтобы каждый вектор имел длину 1.

Более конкретно, мы рассмотрим, как это сделать, используя:

  • библиотека scikit-learn
  • linalg.norm() метод numpy и,
  • linalg.norm() в scipy

Во-первых, давайте создадим массив NumPy, на который мы будем ссылаться в наших примерах, чтобы продемонстрировать несколько концепций.

import numpy as np

# Ensure values are reproducible
np.random.seed(1234)
array_1d = np.random.rand(15) * 10
print(array_1d)
array([1.9151945 , 6.22108771, 4.37727739, 7.85358584, 7.79975808,
       2.72592605, 2.76464255, 8.01872178, 9.58139354, 8.75932635,
       3.5781727 , 5.00995126, 6.83462935, 7.12702027, 3.70250755])

Использование метода scikit-learn normalize()

Первый вариант, который у нас есть, когда дело доходит до нормализации массива numpy, — это метод sklearn.preprocessing.normalize(), который можно использовать для индивидуального масштабирования входных векторов до единичной нормы (длины вектора). Это показано в приведенном ниже примере.

from sklearn.preprocessing import normalize
array_1d_norm = normalize(array_1d[:,np.newaxis], axis=0).ravel()
print(array_1d_norm)
[0.07945112 0.25807949 0.18158971 0.32580306 0.32357003 0.11308402
 0.11469016 0.33265366 0.39748051 0.36337736 0.14843915 0.20783595
 0.28353203 0.29566176 0.15359713]

Обратите внимание, что по умолчанию норма, используемая для нормализации ввода, будет установлена ​​на 'l2'. Это означает, что если мы суммируем элементы нашего нормализованного массива, мы не должны ожидать, что он будет равен 1. Фактически, здесь это так:

print(sum(array_1d_norm))
3.578845135327915

Если вы хотите, чтобы сумма результирующего вектора была равна 1 (распределение вероятностей), вы должны передать значение 'l1' в аргумент norm:

from sklearn.preprocessing import normalize
array_1d_norm = normalize(
    array_1d[:,np.newaxis], 
    axis=0, 
    norm='l1',
).ravel()
print(array_1d_norm)
[0.02220021 0.0721125  0.05073975 0.09103581 0.09041186 0.03159791
 0.03204669 0.09295    0.1110639  0.10153481 0.04147683 0.05807347
 0.07922445 0.08261373 0.04291807]

Теперь, если мы суммируем значения результирующего массива, мы должны ожидать, что он будет равен 1:

print(sum(array_1d_norm))
1

Использование метода numpy и linalg.norm()

Другой вариант, который у нас есть, — это метод numpy linalg.norm(), который вернет одну из восьми различных матричных норм, в зависимости от значения, указанного в аргументе ord (по умолчанию None).

array_1d_norm = array_1d / np.linalg.norm(array_1d)
print(array_1d_norm)
[0.07945112 0.25807949 0.18158971 0.32580306 0.32357003 0.11308402
 0.11469016 0.33265366 0.39748051 0.36337736 0.14843915 0.20783595
 0.28353203 0.29566176 0.15359713]
print(sum(array_1d_norm))
3.578845135327915

Опять же, если вы хотите, чтобы значения суммировались до 1 (например, распределение вероятностей), вам нужно указать ord=1.

array_1d_norm = array_1d / np.linalg.norm(array_1d, ord=1)
print(array_1d_norm)
[0.02220021 0.0721125  0.05073975 0.09103581 0.09041186 0.03159791
 0.03204669 0.09295    0.1110639  0.10153481 0.04147683 0.05807347
 0.07922445 0.08261373 0.04291807]
print(sum(array_1d_norm))
1

Использование метода scipy linalg()

В качестве альтернативы вы даже можете использовать метод scipy.linalg(), так как он по сути содержит те же функции, что и метод linalg() numpy, плюс некоторые дополнительные и более продвинутые функции, не содержащиеся в последнем.

Используемые здесь обозначения точно такие же, как и в предыдущем примере.

from scipy import linalg
array_1d_norm = array_1d / linalg.norm(array_1d, ord=1)
print(array_1d_norm)
[0.02220021 0.0721125  0.05073975 0.09103581 0.09041186 0.03159791
 0.03204669 0.09295    0.1110639  0.10153481 0.04147683 0.05807347
 0.07922445 0.08261373 0.04291807]
print(sum(array_1d_norm))
1

Последние мысли

В сегодняшнем коротком уроке мы обсудили нормализацию массива numpy к единичному вектору. Нормализация данных — это процесс изменения распределения точек числовых данных в конкретном наборе данных. Это обычный шаг преобразования перед обработкой, применяемый на ранних стадиях разработки модели.

Сегодня мы продемонстрировали несколько различных подходов к нормализации массивов numpy, которые в конечном итоге помогут вашей модели машинного обучения работать намного лучше.

Вы также можете узнать больше о другой похожей концепции предварительной обработки и преобразования данных, которая называется масштабирование функций, в одной из моих других статей здесь, на Medium.



Стать участником и читать все истории на Medium. Ваш членский взнос напрямую поддерживает меня и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.



Вам также может понравиться