距离度量与核函数在机器学习中的应用

机器学习领域,评估样本集之间的距离或相似度是一项基础而重要的任务。本文将探讨距离度量和核函数的概念、性质及其在机器学习中的应用。距离度量是一种函数,它能够量化两个对象之间的差异程度。如果对象a和b之间的距离小于对象a和c之间的距离,那么认为a和b更相似。理想情况下,完全相同的两个对象之间的距离应该为零。欧几里得距离是这类度量中最广为人知的例子之一。一个真正的度量需要满足以下四个条件:

  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)(三角不等式)

核函数是衡量相似度的一种方法,如果对象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。这种归一化与卡方距离有关,卡方距离是离散概率分布之间的距离。卡方核函数最常用于视觉词汇的直方图(袋子)上。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485