在机器学习和数据挖掘中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如 K 最近邻(KNN)和 K 均值(K-Means)等等。在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否。本文的目的就是对常用的相似性度量作一个总结。
根据数据特性的不同,可以采用不同的度量方法。一般而言,定义一个距离函数 d(x,y), 需要满足下面几个准则:
- 1) d(x,x) = 0 // 到自己的距离为0;
- 2) d(x,y) >= 0 // 距离非负;
- 3) d(x,y) = d(y,x) // 对称性: 如果 A 到 B 距离是 a,那么 B 到 A 的距离也应该是 a;
- 4) d(x,k)+ d(k,y) >= d(x,y) // 三角形法则: (两边之和大于第三边);
满足这4个条件的距离函数很多,一般有几类是比较常见的,通常来自比较直观的形象,如平面的一个两点的直线距离。下面讨论应用比较广泛的几类距离或相似性度量函数。
===================分割线========================
1.欧式距离(Euclidean Distance)
欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
- 1)二维平面上点a(x1,y1)与b(x2,y2)间的欧氏距离:
- 2)三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:
- 3)n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的欧氏距离(两个n维向量):
也可以用表示成向量运算的形式:
Matlab计算欧氏距离:
例子:计算向量(1,1)、(2,2)、(3,3)、(4,4)两两间的欧式距离
X = [1 1;2 2;3 3;4 4];
d = pdist(X,'euclidean')
d =
1.4142 2.8284 4.2426 1.4142 2.8284 1.4142
Matlab计算距离使用pdist()函数。若X是一个m×n的矩阵,则pdist(X)将X矩阵每一行作为一个n维行向量,然后计算这m个向量两两间的距离。
======================分割线=====================
2. 标准化欧氏距离 (Standardized Euclidean Distance)
定义: 标准化欧氏距离是针对欧氏距离的缺点而作的一种改进。标准欧氏距离的思路:既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。假设样本集X的均值(mean)为m,标准差(standard deviation)为s,X的“标准化变量”表示为:
- 标准化欧氏距离公式:
如果将方差的倒数看成一个权重,也可称之为加权欧氏距离(Weighted Euclidean distance)。
Matlab计算标准化欧氏距离(假设两个分量的标准差分别为0.5和1):
X = [1 1;2 2;3 3;4 4];
d = pdist(X,'seuclidean',[0.5,1])
d =
2.2361 4.4721 6.7082 2.2361 4.4721 2.2361
======================分割线=====================