scikit-learn 成对度量,近似关系和内核
sklearn.metrics.pairwise
子模块工具的实用程序,以评估成对距离或样品集的近似关系。
该模块包含距离度量和内核。这里对两者进行了简要总结。
距离度量函数d(a, b)
,如果对象a
和b
被认为比对象a
和c
更相似 ,则d(a, b) < d(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
核是相似度的量度,如果对象a
和b
被视为比对象a
和c
更为“相似” ,那么s(a, b) > s(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.]])
6.8.1 余弦相似度
cosine_similarity
计算向量的L2正则化点积。也就是说,如果 和 是行向量,它们的余弦相似度 定义为:
之所以称为余弦相似度,是因为欧几里得(L2)正则化将向量投影到单位球体上,然后它们的点积就是向量表示的点之间的角度的余弦值。
该内核是用于计算以tf-idf向量表示的文档的相似度的普遍选择。cosine_similarity
接受 scipy.sparse
矩阵。(请注意,sklearn.feature_extraction.text
中的tf-idf函数可以生成规范的向量,在这种情况下,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
6.8.2 线性核
linear_kernel
函数计算线性核,是在 degree=1
和coef0=0
(同质化)情况下的polynomial_kernel
的特例。如果x
和y
是列向量,则它们的线性核为:
6.8.3 多项式核
polynomial_kernel
函数计算两个向量之间的度数多项式核。多项式核代表两个向量之间的相似性。从概念上讲,多项式内核考虑的不仅是相同维度下向量之间的相似性,还考虑跨维度的。当在机器学习算法中使用时,这可以解决特征交互问题。
多项式内核定义为:
其中:
x
,y
是输入向量d
是内核维度
如果 则说该内核是同质的。
6.8.4 Sigmoid核
sigmoid_kernel
函数计算两个向量之间的sigmoid核。sigmoid核也称为双曲线正切或多层感知器(因为在神经网络领域,它经常被用作神经元激活函数)。它定义为:
其中
x
,y
是输入向量γ 被称为斜率 c0 被称为截距
6.8.5 RBF 核
rbf_kernel
函数计算两个向量之间的径向基函数(RBF)内核。该内核定义为:
其中x
和y
是输入向量。如果 则该核称为方差的高斯核 。
6.6.6 拉普拉斯核
laplacian_kernel
函数是径向基函数内核的一个变体,定义为:
其中x
和y
是输入矢量, 是输入向量之间的曼哈顿距离。
它已被证明在应用于无噪声数据的机器学习中很有用。例如机器学习中的量子力学。
6.8.7 卡方核
卡方核是在计算机视觉应用中训练非线性SVM非常受欢迎的选择。可以使用chi2_kernel
计算,然后将 kernel="precomputed"
传递给 sklearn.svm.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])
卡方核由下式给出
假定数据为非负数,通常将其用L1范数标准化为1。通过与卡方距离的连接来合理化归一化,卡方距离是离散概率分布之间的距离。
卡方核最常用于可视化词汇的直方图(袋)。
参考文献:
Zhang, J. and Marszalek, M. and Lazebnik, S. and Schmid, C. Local features and kernels for classification of texture and object categories: A comprehensive study International Journal of Computer Vision 2007 https://research.microsoft.com/en-us/um/people/manik/projects/trade-off/papers/ZhangIJCV06.pdf