6.8. Парные метрики, родство и ядра ¶
В sklearn.metrics.pairwise
подмодуле реализует утилиты для оценки попарных расстояний или сродства наборов образцов.
Этот модуль содержит как метрики расстояния, так и ядра. Краткое изложение этих двух приведено здесь.
Метрики расстояния — это такие функции d(a, b), что d(a, b) < d(a, c) если объекты a и b считаются «более похожими», чем объекты a и c. Два совершенно одинаковых объекта будут иметь нулевое расстояние. Один из самых популярных примеров — евклидово расстояние. Чтобы быть «истинной» метрикой, она должна удовлетворять следующим четырем условиям:
1. d(a, b) >= 0, for all a and b 2. d(a, b) == 0, if and only if a = b, positive definiteness 3. d(a, b) == d(b, a), symmetry 4. d(a, c) <= d(a, b) + d(b, c), the triangle inequality
Ядра — это меры сходства, т. е s(a, b) > s(a, c) если объекты a и b считаются «более похожими», чем объекты a и c. Ядро также должно быть положительно полуопределенным.
Существует несколько способов преобразования между метрикой расстояния и мерой сходства, например ядром. Позвольте D
быть расстоянием и S
быть ядром:
S = np.exp(-D * gamma)
, Где один эвристический для выбораgamma
является1 / num_features
S = 1. / (D / np.max(D))
Расстояния между векторами-строками и векторами X
-строками Y
можно оценить с помощью pairwise_distances
. Если Y
не указано X
, вычисляются попарные расстояния векторов-строк . Точно так же pairwise.pairwise_kernels
может использоваться для вычисления ядра между X
и Y
с использованием различных функций ядра. См. Справку по API для получения более подробной информации.
>>> import numpy as np >>> from sklearn.metrics import pairwise_distances >>> from sklearn.metrics.pairwise import pairwise_kernels >>> X = np.array([[2, 3], [3, 5], [5, 8]]) >>> Y = np.array([[1, 0], [2, 1]]) >>> pairwise_distances(X, Y, metric='manhattan') array([[ 4., 2.], [ 7., 5.], [12., 10.]]) >>> pairwise_distances(X, metric='manhattan') array([[0., 3., 8.], [3., 0., 5.], [8., 5., 0.]]) >>> pairwise_kernels(X, Y, metric='linear') array([[ 2., 7.], [ 3., 11.], [ 5., 18.]])
6.8.1. Косинусное подобие
cosine_similarity
вычисляет L2-нормализованное скалярное произведение векторов. То есть, если $x$ а также $y$ являются векторами-строками, их косинусное подобие $k$ определяется как:
$$k(x, y) = \frac{x y^\top}{|x| |y|}$$
Это называется косинусоидальным подобием, потому что евклидова (L2) нормализация проецирует векторы на единичную сферу, а их скалярное произведение в этом случае является косинусом угла между точками, обозначенными векторами.
Это ядро часто используется для вычисления подобия документов, представленных в виде векторов tf-idf. cosine_similarity
принимает scipy.sparse
матрицы. (Обратите внимание, что функция tf-idf в sklearn.feature_extraction.text
может создавать нормализованные векторы, и в этом случае cosine_similarity
эквивалентно linear_kernel
, только медленнее.)
Рекомендации
- CD Мэннинг, П. Рагхаван и Х. Шютце (2008). Введение в поиск информации. Издательство Кембриджского университета. https://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html
6.8.2. Линейное ядро
Функция linear_kernel
вычисляет линейное ядро, то есть частный случай polynomial_kernel
с degree=1
и coef0=0
(однородный). Если x
и y
являются векторами-столбцами, их линейное ядро:
$$k(x, y) = x^\top y$$
6.8.3. Полиномиальное ядро
Функция polynomial_kernel
вычисляет ядро полинома степени d между двумя векторами. Ядро полинома представляет собой подобие между двумя векторами. Концептуально полиномиальные ядра учитывают не только сходство между векторами в одном измерении, но и между измерениями. При использовании в алгоритмах машинного обучения это позволяет учитывать взаимодействие функций.
Ядро полинома определяется как:
$$k(x, y) = (\gamma x^\top y +c_0)^d$$
где:
x
,y
являются входными векторамиd
степень ядра
Если $c_0 = 0$ ядро называется однородным.
6.8.4. Сигмовидное ядро
Функция sigmoid_kernel
вычисляет сигмовидное ядро между двумя векторами. Сигмовидное ядро также известно как гиперболический тангенс или многослойный персептрон (потому что в области нейронной сети он часто используется как функция активации нейрона). Это определяется как:
$$k(x, y) = \tanh( \gamma x^\top y + c_0)$$
где:
x
,y
являются входными векторами- $\gamma$ известен как склон
- $c_0$ известен как перехват
6.8.5. Ядро RBF
Функция rbf_kernel
вычисляет ядро радиальной базисной функции (radial basis function RBF) между двумя векторами. Это ядро определяется как:
$$k(x, y) = \exp( -\gamma | x-y |^2)$$
где x
и y
— входные векторы. Если $\gamma = \sigma^{-2}$ ядро известно как гауссово ядро дисперсии $\sigma^2$
6.8.6. Ядро лапласа
Функция laplacian_kernel
является вариантом ядра радиальной базисной функции, определяемого как:
$$k(x, y) = \exp( -\gamma | x-y |_1)$$
где x
и y
— входные векторы, $|x-y|_1$ — манхэттенское расстояние между входными векторами.
Он оказался полезным в машинном обучении применительно к бесшумным данным. См., Например, « Машинное обучение для квантовой механики в двух словах» .
6.8.7. Ядро хи-квадрат
Ядро хи-квадрат — очень популярный выбор для обучения нелинейных SVM в приложениях компьютерного зрения. Она может быть вычислена с помощью , chi2_kernel
а затем передаваемая SVC
с kernel="precomputed"
:
>>> from sklearn.svm import SVC >>> from sklearn.metrics.pairwise import chi2_kernel >>> X = [[0, 1], [1, 0], [.2, .8], [.7, .3]] >>> y = [0, 1, 0, 1] >>> K = chi2_kernel(X, gamma=.5) >>> K array([[1. , 0.36787944, 0.89483932, 0.58364548], [0.36787944, 1. , 0.51341712, 0.83822343], [0.89483932, 0.51341712, 1. , 0.7768366 ], [0.58364548, 0.83822343, 0.7768366 , 1. ]]) >>> svm = SVC(kernel='precomputed').fit(K, y) >>> svm.predict(K) array([0, 1, 0, 1])
Его также можно напрямую использовать в качестве kernel
аргумента:
>>> svm = SVC(kernel=chi2_kernel).fit(X, y) >>> svm.predict(X) array([0, 1, 0, 1])
Ядро хи в квадрате дается формулой
$$k(x, y) = \exp \left (-\gamma \sum_i \frac{(x[i] — y[i]) ^ 2}{x[i] + y[i]} \right )$$
Предполагается, что данные неотрицательны и часто нормализуются, чтобы иметь L1-норму, равную единице. Нормализация рационализируется с помощью связи с расстоянием хи-квадрат, которое представляет собой расстояние между дискретными распределениями вероятностей.
Ядро хи-квадрат чаще всего используется на гистограммах (мешках) визуальных слов.
Рекомендации:
- Чжан Дж. И Маршалек М. и Лазебник С. и Шмид К. Локальные особенности и ядра для классификации текстур и категорий объектов: всестороннее исследование International Journal of Computer Vision 2007 https://research.microsoft.com/ ru-us / um / people / manik / projects / компромисс / документы / ZhangIJCV06.pdf