Spec-Zone.ru › scikit-learn

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 — ядро:

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

8.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, но работает медленнее.)

Литература

  • 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 — векторы-столбцы, их линейное ядро равно:

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

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

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

Полиномиальное ядро определяется следующим образом:

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

где:

  • x, y — входные векторы
  • d — степень ядра

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

8.8.4. Сигмоидальное ядро

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

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

где:

  • x, y — входные векторы
  • \(\gamma\) — наклон
  • \(c_0\) — свободный член

8.8.5. Ядро RBF

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

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

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

8.8.6. Ядро Лапласа

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

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

где 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])

Хи-квадратное ядро задаётся формулой

\[k(x, y) = \exp \left (-\gamma \sum_i \frac{(x[i] - y[i]) ^ 2}{x[i] + y[i]} \right )\]

Предполагается, что данные неотрицательны; часто их нормируют так, чтобы 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API