6.8. 成对度量、亲和力和核函数#

sklearn.metrics.pairwise 子模块实现了用于评估样本集合之间成对距离或亲和力的工具。

该模块包含距离度量和核函数。这里简要总结了这两者。

距离度量是函数 d(a, b) ,使得 d(a, b) < d(a, c) 如果对象 ab 被认为比对象 ac “更相似”。两个完全相同的对象的距离为零。最流行的例子之一是欧几里得距离。要成为一个’真正的’度量,它必须遵守以下四个条件:

1. d(a, b) >= 0,对于所有 a 和 b
2. d(a, b) == 0,当且仅当 a = b,正定性
3. d(a, b) == d(b, a),对称性
4. d(a, c) <= d(a, b) + d(b, c),三角不等式

核函数是相似性的度量,即 s(a, b) > s(a, c) 如果对象 ab 被认为比对象 ac “更相似”。核函数还必须是半正定的。

有多种方法可以在距离度量和相似性度量(如核函数)之间进行转换。设 D 为距离, S 为核函数:

  1. S = np.exp(-D * gamma) ,其中选择 gamma 的一个启发式方法是 1 / num_features

  2. S = 1. / (D / np.max(D))

可以使用 pairwise_distances 计算矩阵 XY 的行向量之间的距离。如果省略 Y ,则计算矩阵 X 的行向量之间的成对距离。类似地,可以使用 pairwise.pairwise_kernels 计算 XY 之间的核函数,使用不同的核函数。有关更多详细信息,请参阅 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 矩阵。 (注意, sklearn.feature_extraction.text 中的 tf-idf 功能可以生成归一化向量, 在这种情况下,cosine_similarity 等价于 linear_kernel ,只是速度较慢。)

参考文献

6.8.2. 线性核#

函数 linear_kernel 计算线性核,即 polynomial_kerneldegree=1coef0=0 (齐次)情况下的特例。 如果 xy 是列向量,它们的线性核为:

\[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 核#

函数 sigmoid_kernel 计算两个向量之间的 Sigmoid 核。Sigmoid 核也称为双曲正切函数,或称为多层感知器(因为在神经网络领域,它经常被用作神经元激活函数)。它定义为:

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

其中 xy 是输入向量。如果 \(\gamma = \sigma^{-2}\) ,该核被称为方差为 \(\sigma^2\) 的高斯核。

6.8.6. 拉普拉斯核#

函数 laplacian_kernel 是径向基函数核的一种变体,定义为:

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

其中 xy 是输入向量,\(\|x-y\|_1\) 是输入向量之间的曼哈顿距离。

它在应用于无噪声数据的机器学习中已被证明是有用的。参见例如 `量子力学中的机器学习简述 `_ 。 <https://onlinelibrary.wiley.com/doi/10.1002/qua.24954/abstract/> `_.

6.8.7. Chi-squared kernel#

Chi-squared kernel 是在计算机视觉应用中训练非线性 SVM 时非常受欢迎的选择。 它可以通过 :func:` chi2_kernel`计算,然后传递给带有 kernel="precomputed"SVC

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

Chi-squared kernel 的定义如下

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

数据假定为非负的,并且通常被归一化以具有 L1 范数。 这种归一化与 Chi-squared 距离的联系有关,Chi-squared 距离是离散概率分布之间的距离。

Chi-squared kernel 最常用于视觉词袋(bags)的直方图。

参考文献