Нормализация массивов 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.
Вам также может понравиться