关于距离度量的方法的专题其实已经想做好久了,正好趁这个机会总结出来。
这里讨论的距离度量应该是向量空间内的度量,两个点(即两个向量)之间的距离或相似性的度量。每种度量包括描述、定义和公式、优缺点、应用等部分。
编辑距离:也叫Levenshtein距离,用来测量文本之间的距离。
这是最常见的两点之间距离度量表示法,即欧几里得度量。我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
即:所有点的对应维度之差的平方的求和再开方。
import numpy
v1=[1 1]
v2=[2,2]
vec1=numpy.array(v1)
vec2=numpy.array(v2)
ist = numpy.linalg.norm(vec1 - vec2)
>>> ist
1.4142135623730951
根据维基百科, 曼哈顿距离的由来和定义如下:
曼哈顿距离的命名原因是从规划为方型建筑区块的城市(如曼哈顿)间,最短的行车路径而来(忽略曼哈顿的单向车道以及只存在于3、14大道的斜向车道)。任何往东三区块、往北六区块的的路径一定最少要走九区块,没有其他捷径。
曼哈顿距离也称为 城市街区距离(City Block distance),也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的 投影的距离总和。
曼哈顿距离其实就相当于两点在各个坐标轴上的投影距离之和。
如下图所示:
其中,绿线表示欧式距离,红、蓝、黄表示相等的曼哈顿距离。
要注意的是,曼哈顿距离依赖坐标系统的转度,而非系统在坐标轴上的平移或映射。
维基百科中, 切比雪夫距离的定义如下:
数学上,切比雪夫距离(Chebyshev distance)是向量空间中的一种度量,二个点之间的距离定义为其各座标数值差的最大值。
若将国际象棋棋盘放在二维直角座标系中,格子的边长定义为1,座标的x轴及y轴和棋盘方格平行,原点恰落在某一格的中心点,则王从一个位置走到其他位置需要的步数恰为二个位置的切比雪夫距离,因此 切比雪夫距离也称为棋盘距离。
切比雪夫距离的距离公式如下:
二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离:
n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)的切比雪夫距离:
在书中提到,Lp距离即是Minkowski距离。闵氏距离不是一种距离,而是一组距离的定义。
在上面曼哈顿距离和切比雪夫距离中,都有提到过Lp距离。根据p取值的不同,闵式距离代表的含义也不同。我们来看一下闵式距离到底是什么距离度量方法。
闵可夫斯基距离并没有查到中文的维基百科词条,查阅英文wiki的。 Minkowski distance中,对Minkowski distance的定义如下:
The Minkowski distance is a metric on Euclidean space which can be considered as a generalization of both the Euclidean distance and the Manhattan distance.
是说,闵式距离是定义在欧几里得空间空间上的度量标准,可以被认为是欧氏距离和曼哈顿距离的推广。
The Minkowski distance can also be viewed as a multiple of the power mean of the component-wise differences between P and Q.
即是说,闵式距离可以看做p和q之间,所有元素的不同的幂平均。
两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:
也就是说,对p和q的各项之差的p次方求和后,开(1/p)次方。
图中清晰的展示了随着p值的增大,与原点的闵式距离为1的点的图形的演化过程。我们可以看到:
所以闵式距离可以看做是前三种距离的总结,前三种距离是闵式距离的特例。
在此小总结一下闵式距离的缺点,包括曼哈顿距离、欧氏距离和切比雪夫距离等,都存在明显的缺点。
举个栗子
二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。
那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?
因此用闵氏距离来衡量这些样本间的相似度有问题。
简单说来,闵氏距离的缺点主要有两个:
1. 将各个分量的量纲(scale),也就是“单位”当作相同的看待了。
2. 没有考虑各个分量的分布(期望,方差等)可能是不同的。
标准化欧氏距离是针对简单欧氏距离的缺点而做的一种改进方案。
如前所述闵式距离的缺点,那么, 标准化欧氏距离的思路是:既然数据各维分量的分布不同,那么我先将各个分量都“标准化”到均值、方差相等,之后再进行度量。
假设样本集X的均值为m,标准差为s,那么样本集X的标准化过程用公式描述为:
X* = (X-m)/s
经过简单的推导,可以得到两个n维向量x(x1,…,xn)和y(y1,…,yn)之间的标准化欧式距离公式为:
如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。
优点:考虑了均值、方差,标准化了距离。
在wiki的 Mahalanobis distance中介绍说:
The Mahalanobis distance is a descriptive statistic that provides a relative measure of a data point’s distance (residual) from a common point.
也就是说,马氏距离是提供了一个数据点与公共点之间的相对测量,它是一种描述性统计。
上图有两个正态分布的总体,它们的均值分别为a和b,但方差不一样,则图中的A点离哪个总体更近?或者说A有更大的概率属于谁?
显然,A离左边的更近,A属于左边总体的概率更大,尽管A与a的欧式距离远一些。这就是 马氏距离的直观解释。
概念:马氏距离是基于样本分布的一种距离。物理意义就是在规范化的主成分空间中的欧氏距离。所谓规范化的主成分空间就是利用主成分分析对一些数据进行主成分分解。再对所有主成分分解轴做归一化,形成新的坐标轴。由这些坐标轴张成的空间就是规范化的主成分空间。
定义:有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为:
若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:
则Xi与Xj之间的马氏距离等于他们的欧氏距离。即:若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。
两个等长字符串s1与s2之间的汉明距离定义为: 将其中一个变为另外一个所需要作的最小替换次数。
举个栗子
字符串“1111”与“1001”之间的汉明距离为2。
The Hamming distance between “toned” and “roses” is 3.
汉明距离计算在包括信息论、编码理论、密码学等领域都有应用。比如在信息编码过程中,为了增强容错性,应使得编码间的最小汉明距离尽可能大。但是, 如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。
其实,汉明距离应该算是编辑距离的一种特例(即只包括编辑操作中的“替换”操作)。
至此,前半部分主要考虑了两个向量(点)之间的距离度量,下面我们来看相似度度量。
几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来 衡量样本向量之间的差异。
夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。
关于夹角余弦的应用可以参考吴军的数学之美系列。(数学之美12 - 余弦定理和新闻的分类)
相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。
from numpy import *
a = array([1,2,3,4,6,7,8,9])
b = array([2,4,6,8,10,12,13,15])
c = array([-1,-2,-2,-3,-4,-6,-7,-8])
>>> corrcoef([a,b,c])
array([[ 1. , 0.99535001, -0.9805214 ],
[ 0.99535001, 1. , -0.97172394],
[-0.9805214 , -0.97172394, 1. ]])
杰卡德相似系数:两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
杰卡德相似系数是衡量 两个集合的相似度一种指标。
与杰卡德相似系数 相反的概念是杰卡德距离(Jaccard distance)。
杰卡德距离可用如下公式表示, 用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度:
可将杰卡德相似系数用在衡量样本的相似度上。
举个栗子
样本A与样本B是两个n维向量,而且所有维度的取值都是0或1,例如:A(0111)和B(1011)。
我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。
M11:样本A与B都是1的维度的个数
M01:样本A是0,样本B是1的维度的个数
M10:样本A是1,样本B是0 的维度的个数
M00:样本A与B都是0的维度的个数
依据上文给的杰卡德相似系数及杰卡德距离的相关定义,样本A与B的杰卡德相似系数J可以表示为:
这里M11+M01+M10可理解为A与B的并集的元素个数,而M11是A与B的交集的元素个数。
我们已经描述了什么是相关系数(Correlation coefficient)与相关距离(Correlation distance),此处需要用到相关概念。
在统计学中,皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,又称作 PPMCC或PCCs, 用r表示)用于度量两个变量X和Y之间的相关(线性相关), 其值介于-1与1之间。
通常情况下通过以下取值范围判断变量的相关强度:
相关系数 相关程度
0.8-1.0 极强相关
0.6-0.8 强相关
0.4-0.6 中等程度相关
0.2-0.4 弱相关
0.0-0.2 极弱相关或无相关
在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的。这个相关系数也称作“皮尔森相关系数r”。
两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
以上方程定义了总体相关系数, 一般表示成希腊字母ρ(rho)。基于样本对协方差和方差进行估计,可以得到样本标准差, 一般表示成r:
from math import sqrt
def multipl(a,b):
sumofab=0.0
for i in range(len(a)):
temp=a[i]*b[i]
sumofab+=temp
return sumofab
def corrcoef(x,y):
n=len(x)
#求和
sum1=sum(x)
sum2=sum(y)
#求乘积之和
sumofxy=multipl(x,y)
#求平方和
sumofx2 = sum([pow(i,2) for i in x])
sumofy2 = sum([pow(j,2) for j in y])
num=sumofxy-(float(sum1)*float(sum2)/n)
#计算皮尔逊相关系数
den=sqrt((sumofx2-float(sum1**2)/n)*(sumofy2-float(sum2**2)/n))
return num/den
x = [0,1,0,3]
y = [0,1,1,1]
print corrcoef(x,y) #0.471404520791
信息熵并不属于一种相似性度量。但在有些时候,对两个向量的距离进行判断,或者对两个向量进行相似度度量,或者需要对某些点进行取舍的时候,并非一定按照距离或相似度的比较来取舍,有些是 按照整体数据集的信息熵的变化大小来取舍的。
例如,在决策树模型中,判断如何 选择哪个特征进行分类,使用的就是 信息增益或信息增益比来进行判断。
距离和相似度都是用来取舍的一种度量方法,信息熵也算是一种。因此,把他们放到一起来比较。
信息熵是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。
计算给定的样本集X的信息熵的公式为:
其中,n表示样本集X的分类数,pi表示X中第i类元素出现的概率。
信息熵越大表明样本集S分类越分散,信息熵越小则表明样本集X分类越集中。。当S中n个分类出现的概率一样大时(都是1/n),信息熵取最大值log2(n)。当X只有一个分类时,信息熵取最小值0。
把距离、相似度和熵的度量方法列出来了。下面最后做一个总结。July在他的博客里做了总结,我补充了下,结果如下:
空间:欧氏距离;
路径:曼哈顿距离;
国际象棋国王:切比雪夫距离;
以上三种的统一形式:闵可夫斯基距离;
加权:标准化欧氏距离;
排除量纲和依存:马氏距离;
测量两个离散或连续概率分布的相似性:巴氏距离
编码差别:汉明距离;
向量差距:夹角余弦;
相关:相关系数与相关距离;
集合近似度:杰卡德相似系数与距离;
度量两个变量X和Y之间的相关(线性相关):皮尔逊系数;
衡量分布的混乱程度或分散程度:熵。