Spec-Zone.ru › scikit-learn

6.8. Метрики парных сравнений, близости и ядра

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

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

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

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

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

Ссылки

  • К.Д. Мэннинг, П. Рагхаван и Х. Шуце (2008). Введение в информационный поиск. Cambridge University Press. https://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html

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\) - известный сдвиг

6.8.5. Ядро RBF

Функция rbf_kernel вычисляет ядро радиальной базисной функции (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\) - манхэттенское расстояние между входными векторами.

Оно оказалось полезным в задачах машинного обучения, применяемых к данным без шума. См., например, Machine learning for quantum mechanics in a nutshell.

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

Его также можно использовать напрямую в качестве аргумента 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–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/modules/metrics.html

Spec-Zone.ru

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