距离度量的相似度计算
在数据分析和数据挖掘中,经常需要数值化样本个体间差异的大小,进而评价个体的相似度或者进行分类。比如统计分析中的相关性分析,数据挖掘中进行的KNN分类与K-means聚类,还有推荐系统算法中搜索引擎的物品推荐。
为了能由简及易的深刻阐述样本相似度的基本原理和应用,我们从一个基本的例子出发,并且结合程序计算,结合图像直观区分各个相似之间的差异。
- 由距离引出的相似度
- 欧几里得距离
- 曼哈顿距离
- 闵可夫斯基距离
- 余弦相似度
- 杰卡德相似度
- 皮尔逊相关系数
样本 | 特征1 | 特征2 | 特征3 | 特征4 |
---|---|---|---|---|
样本1 | 1 | 3 | 2 | 4 |
样本2 | 2 | 5 | 3 | 1 |
一、欧氏距离(Euclidean distance)
欧氏距离是最常用的距离计算公式,衡量的是多维空间中各个点之间的绝对距离,因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别(标准化),比如:计算两个城市的经济状况,其中农业生产总值(元)、交通运输流量(吨)、商业出口进口比(%),如果用欧式距离计算,那么量级大的指标的影响就会覆盖数量级小的指标。所以在计算欧式距离时,需要先进行样本标准化。
n维空间的公式:
由欧式距离引出的相似度计算:
s i m = 1 1 + d ( x , y ) sim=\frac{1}{1+d(x,y)} sim=1+d(x,y)1
因为距离越远,则相似度越小。同时考虑到d(x,y)
可能等于0,所以分母就写成1+d(x,y)
然后取倒数。
# 欧式距离
def Eculidean(x,y):
return sqrt(sum(pow(a-b,2) for a,b in zip(x,y)))
# 计算两个样本的欧式距离
dist = Eculidean([1,3,2,4],[2,5,3,1])
sim = 1/(1+dist)
print("样本的相似度:{}".format(sim))
样本的相似度:0.20521309615767264
二、曼哈顿距离(Manhattan Distance)
想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)。
计算方法相比欧式距离更加简单,比如现在的两个向量X=[1,3,2,4],Y=[2,5,3,1],则d(a,b)=|1-2|+|3-5|+|2-3|+|4-1|=7
,同样更加距离与相似度之间的关系:
s i m = 1 1 + d ( x , y ) sim=\frac{1}{1+d(x,y)} sim=1+d(x,y)1
# 曼哈顿距离
def Manhattan(x,y):
return sum(abs(a-b) for a,b in zip(x,y))
# 计算两个样本的曼哈顿距离
dist = Manhattan([1,3,2,4],[2,5,3,1])
sim = 1/(1+dist)
print("样本的相似度:{}".format(sim))
样本的相似度:0.125
一图观欧式距离与曼哈顿距离的区别:
三、闵可夫斯基距离
闵可夫斯基距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。
d i s t ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 p dist(x_i,x_j)=\big(\sum_{u=1}^n|x_{iu}-x_{ju}|^p\big)^\frac{1}{p}