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

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

Рекомендации

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$$

где:

  • xy являются входными векторами
  • d степень ядра

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

6.8.4. Сигмовидное ядро

Функция sigmoid_kernel вычисляет сигмовидное ядро ​​между двумя векторами. Сигмовидное ядро ​​также известно как гиперболический тангенс или многослойный персептрон (потому что в области нейронной сети он часто используется как функция активации нейрона). Это определяется как:
$$k(x, y) = \tanh( \gamma x^\top y + c_0)$$

где:

  • xyявляются входными векторами
  • $\gamma$ известен как склон
  • $c_0$ известен как перехват

6.8.5. Ядро RBF

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

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

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

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

Рекомендации: