8.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.]])
8.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). Введение в информационный поиск. Издательство Кембриджского университета. https://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html
8.8.2. Линейное ядро
Функция linear_kernel вычисляет линейное ядро, являющееся частным случаем polynomial_kernel при degree=1 и coef0=0 (однородное ядро). Если x и y — векторы-столбцы, их линейное ядро равно:
8.8.3. Полиномиальное ядро
Функция polynomial_kernel вычисляет полиномиальное ядро степени d для двух векторов. Полиномиальное ядро представляет собой меру сходства двух векторов. Концептуально оно учитывает не только сходство векторов по одним и тем же измерениям, но и сходство по разным измерениям. Использование этого ядра в алгоритмах машинного обучения позволяет учитывать взаимодействие признаков.
Полиномиальное ядро определяется следующим образом:
где:
-
x,y— входные векторы -
d— степень ядра
Если \(c_0 = 0\), ядро называется однородным.
8.8.4. Сигмоидальное ядро
Функция sigmoid_kernel вычисляет сигмоидальное ядро для двух векторов. Сигмоидальное ядро также известно как гиперболический тангенс или многослойный перцептрон (в области нейронных сетей оно часто используется в качестве функции активации нейрона). Оно определяется следующим образом:
где:
-
x,y— входные векторы - \(\gamma\) — наклон
- \(c_0\) — свободный член
8.8.5. Ядро RBF
Функция rbf_kernel вычисляет ядро радиальной базисной функции (RBF) для двух векторов. Это ядро определяется следующим образом:
где x и y — входные векторы. Если \(\gamma = \sigma^{-2}\), ядро называется гауссовым ядром с дисперсией \(\sigma^2\).
8.8.6. Ядро Лапласа
Функция laplacian_kernel — вариант ядра радиальной базисной функции, определяемый следующим образом:
где x и y — входные векторы, а \(\|x-y\|_1\) — расстояние Манхэттена между входными векторами.
Это ядро оказалось полезным в машинном обучении на данных без шума. См., например, Машинное обучение для квантовой механики в кратком изложении.
8.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-норма равнялась единице. Такая нормализация обоснована связью с расстоянием хи-квадрат, которое измеряет расстояние между дискретными распределениями вероятностей.
Хи-квадратное ядро чаще всего используется для гистограмм (мешков) визуальных слов.
Литература
- Zhang, J., Marszalek, M., Lazebnik, S. и Schmid, C. Локальные признаки и ядра для классификации текстур и категорий объектов: всестороннее исследование. Международный журнал компьютерного зрения, 2007. https://hal.archives-ouvertes.fr/hal-00171412/document
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/metrics.html