6.8. Парные метрики, Cходство и Ядра

Подмодуль sklearn.metrics.pairwise реализует утилиты для оценки попарных расстояний или близости наборов выборок.

Этот модуль содержит как метрики расстояний, так и ядра. Краткое изложение этих двух факторов приведено здесь.

Метрики расстояния - это функции d(a, b) такие, что d(a, b) < d(a, c), если рассматриваются объекты a и b “более похожи”, чем объекты “a” и “c”. Два совершенно одинаковых объекта будут иметь нулевое расстояние. Одним из самых популярных примеров является евклидово расстояние. Чтобы быть “истинной” метрикой, она должна подчиняться следующим четырем условиям:

  1. d(a, b) >= 0, для всех a и b

  2. d(a, b) == 0, если и только a = b, положительная определенность

  3. d(a, b) == d(b, a), Симметрия

  4. d(a, c) <= d(a, b) + d(b, c), неравенство треугольника

Ядра являются мерами сходства, т.е. s(a, b) > s(a, c), если объекты a и b считаются “более похожими”, чем объекты a и c. Ядро также должно быть положительно полуопределенным.

Существует несколько способов преобразования между метрикой расстояния и мерой сходства, например ядром. Пусть D будет расстоянием, а S будет ядром:

  1. S = np.exp(-D * gamma), где одна эвристика для выбора

    gamma это 1 / num_features

  2. 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\) определяется как:

\[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, только медленнее.)

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\) известен как перехват (intercept)

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])

Его также можно напрямую использовать в качестве аргумента ядра:

>>> 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-норма была равна единице. Нормализация рационализирована привязкой к расстоянию хи-квадрат, которое представляет собой расстояние между дискретными распределениями вероятностей.

Ядро хи-квадрат чаще всего используется в гистограммах (мешках) визуальных слов.