在机器学习领域,评估样本集之间的距离或相似度是一项基础而重要的任务。本文将探讨距离度量和核函数的概念、性质及其在机器学习中的应用。距离度量是一种函数,它能够量化两个对象之间的差异程度。如果对象a和b之间的距离小于对象a和c之间的距离,那么认为a和b更相似。理想情况下,完全相同的两个对象之间的距离应该为零。欧几里得距离是这类度量中最广为人知的例子之一。一个真正的度量需要满足以下四个条件:
d(a, b) >= 0
对于所有的a和bd(a, b) == 0
当且仅当a等于b(正定性)d(a, b) == d(b, a)
(对称性)d(a, c) <= d(a, b) + d(b, c)
(三角不等式)核函数是衡量相似度的一种方法,如果对象a和b之间的核函数值大于对象a和c之间的值,那么认为a和b更相似。核函数必须也是半正定的。存在多种方法可以在距离度量和相似度度量(如核函数)之间进行转换。例如,设D为距离,S为核函数,则可以通过以下公式进行转换:
S = np.exp(-D * gamma)
其中,gamma的选择有一个启发式规则是:
gamma = 1 / num_features
或者
S = 1. / (D / np.max(D))
可以使用pairwise_distances函数来计算X和Y的行向量之间的距离。如果省略Y,则计算X的行向量之间的成对距离。类似地,pairwise.pairwise_kernels函数可以用来使用不同的核函数计算X和Y之间的核。更多细节请参考API参考文档。
接下来,通过一些Python代码示例来展示如何使用这些函数。首先,需要导入必要的库:
>>> import numpy as np
>>> from sklearn.metrics import pairwise_distances
>>> from sklearn.metrics.pairwise import pairwise_kernels
然后,创建两个数组X和Y,并使用'manhattan'度量来计算它们之间的距离:
>>> 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.]])
如果只对X的行向量之间的距离感兴趣,可以省略Y参数:
>>> pairwise_distances(X, metric='manhattan')
array([[0., 3., 8.],
[3., 0., 5.],
[8., 5., 0.]])
同样地,可以使用pairwise_kernels函数来计算X和Y之间的核:
>>> pairwise_kernels(X, Y, metric='linear')
array([[ 2., 7.],
[ 3., 11.],
[ 5., 18.]])
在机器学习中,余弦相似度是一种常用的衡量向量之间相似度的方法。它通过计算两个向量的点积并将其归一化来实现。如果x和y是行向量,它们的余弦相似度k定义为:
k(x, y) = (x * y^T) / (||x|| * ||y||)
这种相似度度量的名称来源于欧几里得(L2)归一化将向量投影到单位球面上,然后它们的点积就是向量之间角度的余弦值。这种核函数在计算文档相似度时非常流行,特别是当文档以tf-idf向量表示时。余弦相似度函数可以接受scipy.sparse矩阵作为输入。
线性核函数是多项式核函数的一个特例,其中次数为1且没有常数项(齐次)。如果x和y是列向量,它们的线性核定义为:
k(x, y) = x^T * y
多项式核函数计算两个向量之间的d次多项式核。多项式核不仅考虑了同一维度下向量之间的相似度,还考虑了跨维度的相似度。当在机器学习算法中使用时,这允许考虑特征之间的交互。多项式核定义为:
k(x, y) = (gamma * x^T * y + c0)^d
其中,x和y是输入向量,d是核函数的次数。如果c0等于0,则核函数被称为齐次的。
Sigmoid核函数,也称为双曲正切核,或多层感知器核(因为在神经网络领域,它通常用作神经元激活函数),它定义为:
k(x, y) = tanh(gamma * x^T * y + c0)
其中,x和y是输入向量,gamma被称为斜率,c0被称为截距。
径向基函数(RBF)核函数计算两个向量之间的RBF核。这种核定义为:
k(x, y) = exp(-gamma * ||x-y||^2)
其中x和y是输入向量。如果gamma等于sigma的负二次方,那么这个核被称为方差为sigma^2的高斯核。
拉普拉斯核函数是径向基函数核的一个变体,定义为:
k(x, y) = exp(-gamma * ||x-y||_1)
其中x和y是输入向量,||x-y||_1是输入向量之间的曼哈顿距离。它在应用于无噪声数据的机器学习中被证明是有用的。
卡方核函数是计算机视觉应用中训练非线性支持向量机(SVM)的非常流行选择。它可以使用chi2_kernel计算,然后传递给一个预设了“预先计算”核函数的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)
svm = SVC(kernel='precomputed').fit(K, y)
svm.predict(K)
卡方核函数也可以直接用作核函数参数:
svm = SVC(kernel=chi2_kernel).fit(X, y)
svm.predict(X)
卡方核函数由以下公式给出:
k(x, y) = exp(-gamma * sum((x[i] - y[i])^2 / (x[i] + y[i]))]
假设数据是非负的,并且通常被归一化,使得L1范数为1。这种归一化与卡方距离有关,卡方距离是离散概率分布之间的距离。卡方核函数最常用于视觉词汇的直方图(袋子)上。