7.8. Парные метрики, сходства и ядра#

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

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

Метрики расстояния — это функции d(a, b) такой, что d(a, b) < d(a, c) проверка на несоответствие во внутреннем представлении и вызов ошибки вместо segfault. Это исправление также решает 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) проверка на несоответствие во внутреннем представлении и вызов ошибки вместо segfault. Это исправление также решает 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.]])

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

Ссылки

7.8.2. Линейное ядро#

Функция linear_kernel вычисляет линейное ядро, то есть частный случай polynomial_kernel с degree=1 и coef0=0 (однородный). Если x и y являются векторами-столбцами, их линейное ядро:

\[k(x, y) = x^\top y\]

7.8.3. Полиномиальное ядро#

Функция polynomial_kernel вычисляет полиномиальное ядро степени d между двумя векторами. Полиномиальное ядро представляет сходство между двумя векторами. Концептуально, полиномиальное ядро учитывает не только сходство между векторами в одном измерении, но и между измерениями. При использовании в алгоритмах машинного обучения это позволяет учитывать взаимодействие признаков.

Полиномиальное ядро определяется как:

\[k(x, y) = (\gamma x^\top y +c_0)^d\]

где:

  • x, y являются входными векторами

  • d является степенью ядра

Если \(c_0 = 0\) ядро называется однородным.

7.8.4. Сигмоидное ядро#

Функция sigmoid_kernel вычисляет сигмоидное ядро между двумя векторами. Сигмоидное ядро также известно как гиперболический тангенс или многослойный перцептрон (поскольку в области нейронных сетей оно часто используется как функция активации нейрона). Оно определяется как:

\[k(x, y) = \tanh( \gamma x^\top y + c_0)\]

где:

  • x, y являются входными векторами

  • \(\gamma\) известен как наклон

  • \(c_0\) известен как свободный член (intercept)

7.8.5. Ядро RBF#

Функция rbf_kernel вычисляет радиально-базисную функцию (RBF) ядра между двумя векторами. Это ядро определяется как:

\[k(x, y) = \exp( -\gamma \| x-y \|^2)\]

где x и y являются входными векторами. Если \(\gamma = \sigma^{-2}\) ядро известно как гауссово ядро с дисперсией \(\sigma^2\).

7.8.6. Ядро Лапласа#

Функция laplacian_kernel является вариантом ядра радиальной базисной функции, определённым как:

\[k(x, y) = \exp( -\gamma \| x-y \|_1)\]

где x и y являются входными векторами, а \(\|x-y\|_1\) является манхэттенским расстоянием между входными векторами.

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

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

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

Ссылки

  • Чжан, Дж. и Маршалек, М. и Лажебник, С. и Шмид, К. Локальные признаки и ядра для классификации текстур и категорий объектов: всестороннее исследование Международный журнал компьютерного зрения 2007 https://hal.archives-ouvertes.fr/hal-00171412/document