7.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.]])
7.8.1. Cosine similarity#
cosine_similarity
计算L2规格化的L2点积。即如果 \(x\) 和 \(y\) 都是行载体,它们的cos相似性 \(k\) 定义为:
这被称为Cosine相似性,因为欧几里得(L2)正规化将这些载体投影到单位球体上,而它们的点积则是由这些载体表示的点之间的角度的Cosine。
该内核是计算以tf-idf载体表示的文档相似性的流行选择。 cosine_similarity
接受 scipy.sparse
矩阵。(Note tf-idf功能 sklearn.feature_extraction.text
可以产生规格化的载体,在这种情况下 cosine_similarity
相当于 linear_kernel
,只是慢一点。)
引用
C.D.曼宁、P. Raghavan和H. Schütze(2008)。信息检索简介。剑桥大学出版社。https://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html
7.8.2. 线性核#
功能 linear_kernel
计算线性核,即 polynomial_kernel
与 degree=1
和 coef0=0
(同质)。如果 x
和 y
都是列载体,它们的线性核是:
7.8.3. 多项式核#
功能 polynomial_kernel
计算两个载体之间的d次多项核。多项核表示两个载体之间的相似性。从概念上讲,多项核不仅考虑同一维度下的载体之间的相似性,还考虑跨维度的相似性。当用于机器学习算法时,这允许考虑特征交互。
多项核定义为:
其中:
x
,y
是输入载体d
是核心度
如果 \(c_0 = 0\) 内核被称为是均匀的。
7.8.4. Sigmoid核#
功能 sigmoid_kernel
计算两个载体之间的Sigmoid核。Sigmoid核也被称为双曲切或多层感知器(因为,在神经网络领域,它经常被用作神经元激活函数)。它的定义是:
其中:
x
,y
是输入载体\(\gamma\) 称为斜率
\(c_0\) 被称为拦截
7.8.5. RBF核#
功能 rbf_kernel
计算两个载体之间的辐射基函数(RBS)核。该内核定义为:
哪里 x
和 y
是输入载体。如果 \(\gamma = \sigma^{-2}\) 该核称为高斯方差核 \(\sigma^2\) .
7.8.6. 拉普拉斯核#
功能 laplacian_kernel
是辐射基函数核的变体,定义为:
哪里 x
和 y
是输入载体, \(\|x-y\|_1\) 是输入向量之间的曼哈顿距离。
事实证明,它在应用于无噪数据的ML中很有用。参见例如 Machine learning for quantum mechanics in a nutshell .
7.8.7. 卡方核#
卡方核是在计算机视觉应用程序中训练非线性支持器的非常流行的选择。它可以通过以下方式计算 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规范为1。通过与卡方距离(离散概率分布之间的距离)的联系来合理化标准化。
chi平方核最常用于视觉单词的柱状图(袋)。
引用
Zhang,J.和Marszalek,M.和Lazebnik,S.和Schmid,C.用于纹理和物体类别分类的局部特征和内核:综合研究国际计算机视觉杂志2007 https://hal.archives-ouvertes.fr/hal-00171412/document