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 будет
ядром:
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.]])
7.8.1. Косинусное сходство#
cosine_similarity вычисляет L2-нормированное скалярное произведение векторов. То есть, если \(x\) и \(y\) являются векторами-строками, их косинусное сходство \(k\) определяется как:
Это называется косинусным сходством, потому что евклидова (L2) нормализация проецирует векторы на единичную сферу, и их скалярное произведение затем является косинусом угла между точками, обозначенными векторами.
Это ядро — популярный выбор для вычисления сходства документов,
представленных в виде tf-idf векторов.
cosine_similarity принимает scipy.sparse матрицы. (Обратите внимание, что функциональность tf-idf в sklearn.feature_extraction.text
может производить нормализованные векторы, в этом случае cosine_similarity
эквивалентно linear_kernel, только медленнее.)
Ссылки
C.D. Manning, P. Raghavan и H. Schütze (2008). Introduction to Information Retrieval. Cambridge University Press. https://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html
7.8.2. Линейное ядро#
Функция linear_kernel вычисляет линейное ядро, то есть частный случай polynomial_kernel с degree=1 и coef0=0 (однородный).
Если x и y являются векторами-столбцами, их линейное ядро:
7.8.3. Полиномиальное ядро#
Функция polynomial_kernel вычисляет полиномиальное ядро степени d между двумя векторами. Полиномиальное ядро представляет сходство между двумя векторами. Концептуально, полиномиальное ядро учитывает не только сходство между векторами в одном измерении, но и между измерениями. При использовании в алгоритмах машинного обучения это позволяет учитывать взаимодействие признаков.
Полиномиальное ядро определяется как:
где:
x,yявляются входными векторамиdявляется степенью ядра
Если \(c_0 = 0\) ядро называется однородным.
7.8.4. Сигмоидное ядро#
Функция sigmoid_kernel вычисляет сигмоидное ядро между двумя векторами. Сигмоидное ядро также известно как гиперболический тангенс или многослойный перцептрон (поскольку в области нейронных сетей оно часто используется как функция активации нейрона). Оно определяется как:
где:
x,yявляются входными векторами\(\gamma\) известен как наклон
\(c_0\) известен как свободный член (intercept)
7.8.5. Ядро RBF#
Функция rbf_kernel вычисляет радиально-базисную функцию (RBF) ядра
между двумя векторами. Это ядро определяется как:
где x и y являются входными векторами. Если \(\gamma = \sigma^{-2}\)
ядро известно как гауссово ядро с дисперсией \(\sigma^2\).
7.8.6. Ядро Лапласа#
Функция laplacian_kernel является вариантом ядра радиальной базисной
функции, определённым как:
где 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])
Ядро хи-квадрат задаётся как
Предполагается, что данные неотрицательны и часто нормализуются до L1-нормы, равной единице. Нормализация обоснована связью с расстоянием хи-квадрат, которое является расстоянием между дискретными распределениями вероятностей.
Ядро хи-квадрат чаще всего используется на гистограммах (мешках) визуальных слов.
Ссылки
Чжан, Дж. и Маршалек, М. и Лажебник, С. и Шмид, К. Локальные признаки и ядра для классификации текстур и категорий объектов: всестороннее исследование Международный журнал компьютерного зрения 2007 https://hal.archives-ouvertes.fr/hal-00171412/document