sklearn.metrics.pairwise
子模块实现了评估样本集的成对距离或相关性。此模块包含距离度量和内核。这里对这两个问题作了简要的总结。距离度量是函数d(a, b)
,如果对象a
和b
被认为比对象a
和c
“更相似”,则d(a, b) < d(a, c)
。两个完全相似的对象距离为零。使用最为广泛的距离度量是欧几里德距离,要成为“真实的”度量,它必须遵守以下四个条件:
1. 对于所有的 a 和 b,d(a, b) >= 0
2. 半正定性:d(a, b) == 0, 当且仅当 a = b
3. 对称性:d(a, b) == d(b, a)
4. 三角不等性:d(a, c) <= d(a, b) + d(b, c)
核函数是相似性的度量,即如果对象a
和b
被认为比对象a
和c
“更相似”,则s(a, b) > s(a, c)
。核函数也必须是半正定的(positive semi-definite)。有很多方法可以在距离度量和相似度量(如核函数)之间进行转换。设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
之间的 kernel 。有关更多详细信息,请参阅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.]])
1. 余弦相似度(cosine similarity)
cosine_similarity
计算L2标准化(L2-normalized)向量的点积。即,如果x和y是行向量,则其余弦相似性k定义为:这被称为余弦相似性,因为欧几里德(L2)标准化将向量投影到单位球面上,然后它们的点积就是由向量所表示的点之间的角度余弦。该核函数是计算文档(以tf-idf向量表示的)间相似度的常用选择。cosine_similarity
接受scipy.sparse
矩阵。(请注意,sklearn.feature_extraction.text
中的 tf-idf 函数可以生成标准化向量,在这种情况下,cosine_similarity
等同于linear_kernel
,速度较慢。)参考文献:C.D. Manning, P. Raghavan and H. Schütze (). Introduction to Information Retrieval. Cambridge University Press. https://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html2. 线性核函数
linear_kernel
函数计算线性核函数,即degree=1
且coef0=0
(齐次)的polynomial_kernel
的一种特殊情况。如果x
和y
是列向量,则它们的线性核函数为:3. 多项式核函数
polynomial_kernel
函数计算两个向量之间的 d 次(degree-d)多项式核函数。多项式核函数表示两个向量之间的相似性,从概念上讲,多项式核函数不仅考虑了同一维数下向量之间的相似性,而且还考虑了跨维数向量之间的相似性,当用于机器学习算法时,可以考虑特征交互性(feature interaction)。多项式核函数定义为:其中:如果,则称内核是齐次的(homogeneous)。x
,y
是输入向量d
is 是核函数的次数(degree)
4. Sigmoid 核函数
sigmoid_kernel
函数计算两个向量之间的sigmoid核函数。sigmoid核函数也被称为双曲正切(hyperbolic tangent)或多层感知器(因为在神经网络领域,它经常被用作神经元激活函数)。定义如下:其中:x
,y
是输入向量 为斜率 为截距
5. RBF 核函数
rbf_kernel
函数计算两个向量之间的径向基函数(RBF)核。此核函数定义为:其中x
和y
是输入向量。如果,则该核函数称为方差为的高斯核函数。6. Laplacian 核函数
laplacian_kernel
函数是径向基函数核的变体,定义如下:其中x
和y
是输入向量,是输入向量之间的曼哈顿距离。它在无噪数据的最大似然估计中得到了很好的应用。参阅量子力学的机器学习。7. Chi-squared (卡方)核函数
chi-squared 核函数是计算机视觉应用中训练非线性支持向量机的一种常用方法。它可以使用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])
chi squared 核函数定义为:假设数据是非负的,并且通常被标准化为L1范数。标准化是通过与卡方距离(即离散概率分布之间的距离)的连接进行合理化的。卡方距离核函数是最常用的可视化直方图(袋)。参考文献: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 /en-us/um/people/manik/projects/trade-off/papers/ZhangIJCV06.pdf
文壹由“伴编辑器”提供技术支持
☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:
欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler,备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)