6.8. Парные метрики, Cходство и Ядра¶
Подмодуль sklearn.metrics.pairwise
реализует утилиты для оценки попарных расстояний или близости наборов выборок.
Этот модуль содержит как метрики расстояний, так и ядра. Краткое изложение этих двух факторов приведено здесь.
Метрики расстояния - это функции d(a, b)
такие, что d(a, b) < d(a, c)
, если рассматриваются объекты a
и b
“более похожи”, чем объекты “a” и “c”. Два совершенно одинаковых объекта будут иметь нулевое расстояние. Одним из самых популярных примеров является евклидово расстояние. Чтобы быть “истинной” метрикой, она должна подчиняться следующим четырем условиям:
d(a, b) >= 0, для всех a и b
d(a, b) == 0, если и только a = b, положительная определенность
d(a, b) == d(b, a), Симметрия
d(a, c) <= d(a, b) + d(b, c), неравенство треугольника
Ядра являются мерами сходства, т.е. 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)¶
cosine_similarity
вычисляет скалярное произведение векторов, нормализованное к L2.
То есть, если \(x\) и \(y\) являются векторами-строками, их косинусное сходство \(k\) определяется как:
Это называется косинусным сходством, поскольку евклидова (L2) нормализация проецирует векторы на единичную сферу, и их скалярное произведение тогда является косинусом угла между точками, обозначенными векторами.
Это ядро является популярным выбором для вычисления сходства документов, представленных в виде векторов tf-idf. cosine_similarity
принимает матрицы scipy.sparse
. (Обратите внимание, что функциональность tf-idf в sklearn.feature_extraction.text
может создавать нормализованные векторы, и в этом случае cosine_similarity
эквивалентна linear_kernel
, только медленнее.)
6.8.2. Линейное ядро¶
Функция linear_kernel
вычисляет линейное ядро, то есть частный случай polynomial_kernel
с degree=1
и coef0=0
(однородный). Если x
и y
являются векторами-столбцами, их линейное ядро имеет вид:
6.8.3. Полиномиальное ядро¶
Функция polynomial_kernel
вычисляет ядро полинома степени d
между двумя векторами.
Полиномиальное ядро представляет сходство между двумя векторами.
Концептуально, полиномиальные ядра учитывают сходство не только между векторами одного и того же измерения, но и между измерениями.
При использовании в алгоритмах машинного обучения это позволяет учитывать взаимодействие функций.
Полиномиальное ядро определяется как:
где:
x
,y
являются входными векторамиd
это степень ядра
Если \(c_0 = 0\) ядро называется однородным.
6.8.4. Сигмовидное ядро¶
Функция sigmoid_kernel
вычисляет сигмовидное ядро между двумя векторами.
Сигмовидное ядро также известно как гиперболический тангенс или многослойный персептрон (поскольку в области нейронных сетей оно часто используется в качестве функции активации нейронов). Он определяется как:
где:
x
,y
являются входными векторами\(\gamma\) известен как склон
\(c_0\) известен как перехват (intercept)
6.8.5. RBF ядро¶
Функция rbf_kernel
вычисляет ядро радиальной базисной функции (radial basis function - RBF) между двумя векторами. Это ядро определяется как:
где “x” и “y” - входные векторы. Если \(\gamma = \sigma^{-2}\), ядро известно как гауссово ядро дисперсии \(\sigma^2\).
6.8.6. Ядро Лапласа¶
Функция laplacian_kernel
представляет собой вариант ядра радиальной базисной функции, определяемый как:
где 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])
Его также можно напрямую использовать в качестве аргумента ядра:
>>> svm = SVC(kernel=chi2_kernel).fit(X, y)
>>> svm.predict(X)
array([0, 1, 0, 1])
Ядро хи-квадрат определяется выражением
Предполагается, что данные неотрицательны и часто нормализуются так, чтобы L1-норма была равна единице. Нормализация рационализирована привязкой к расстоянию хи-квадрат, которое представляет собой расстояние между дискретными распределениями вероятностей.
Ядро хи-квадрат чаще всего используется в гистограммах (мешках) визуальных слов.