参考:https://blog.csdn.net/gamer_gyt/article/details/75165842#t16

   https://blog.csdn.net/ymlgrss/article/details/52854589

完整代码已上传至github  https://github.com/chenzhefan/ML_distance

尽量看上面原文链接吧,复制的公式格式不对,代码优化了放在github

欧氏距离

也称欧几里得距离,是指在m维空间中两个点之间的真实距离。欧式距离在ML中使用的范围比较广,也比较通用,就比如说利用k-Means对二维平面内的数据点进行聚类,对魔都房价的聚类分析(price/m^2 与平均房价)等。

二维空间的欧氏距离

二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离

 
d12=(x1−x2)2+(y1−y2)2−−−−−−−−−−−−−−−−−−√d12=(x1−x2)2+(y1−y2)2

python 实现为:

# coding: utf-8

from numpy import *

def twoPointDistance(a,b):
d = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 )
return d print 'a,b 二维距离为:',twoPointDistance((1,1),(2,2))

三维空间的欧氏距离

三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离

 
d12=(x1−x2)2+(y1−y2)2+(z1−z2)2−−−−−−−−−−−−−−−−−−−−−−−−−−−√d12=(x1−x2)2+(y1−y2)2+(z1−z2)2

python 实现为:

def threePointDistance(a,b):
d = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 + (a[2]-b[2])**2 )
return d print 'a,b 三维距离为:',threePointDistance((1,1,1),(2,2,2))

多维空间的欧氏距离

两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离

 
∑nk=1(x1k−x2k)2−−−−−−−−−−−−⎷∑nk=1(x1k−x2k)2

python 实现为:

def distance(a,b):
sum = 0
for i in range(len(a)):
sum += (a[i]-b[i])**2
return sqrt(sum) print 'a,b 多维距离为:',distance((1,1,2,2),(2,2,4,4))

这里传入的参数可以是任意维的,该公式也适应上边的二维和三维

标准欧氏距离

标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:

  而且标准化变量的数学期望为0,方差为1。因此样本集的标准化过程(standardization)用公式描述就是: 
  

 
X∗=X−msX∗=X−ms

标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差

经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的标准化欧氏距离的公式:

 
d12=∑k=1n(x1k−x2ksk)2−−−−−−−−−−−−−√d12=∑k=1n(x1k−x2ksk)2

如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。

python 实现为

def moreBZOSdis(a,b):
sumnum = 0
for i in range(len(a)):
# 计算si 分量标准差
avg = (a[i]-b[i])/2
si = sqrt( (a[i] - avg) ** 2 + (b[i] - avg) ** 2 )
sumnum += ((a[i]-b[i])/si ) ** 2 return sqrt(sumnum) print 'a,b 标准欧式距离:',moreBZOSdis((1,2,1,2),(3,3,3,4))

曼哈顿距离

又称为城市街区距离(City Block distance), 想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源。同样曼哈顿距离也分为二维,三维和多维。

在计程车几何学中,一个圆是由从圆心向各个固定曼哈顿距离标示出来的点围成的区域,因此这种圆其实就是旋转了45度的正方形。如果有一群圆,且任两圆皆相交,则整群圆必在某点相交;因此曼哈顿距离会形成一个超凸度量空间。

这里有一篇人脸表情分类的论文采用的曼哈顿距离进行计算的,一种人脸表情分类的新方法——Manhattan距离

二维曼哈顿距离

二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

 
d12=|x1−x2|+|y1−y2|d12=|x1−x2|+|y1−y2|

python实现为

def twoMHDdis(a,b):
return abs(a[0]-b[0])+abs(a[1]-b[1]) print 'a,b 二维曼哈顿距离为:', twoMHDdis((1,1),(2,2))

三维曼哈顿距离

三维平面两点a(x1,y1,z1)与b(x2,y2,z2)间的曼哈顿距离

 
d12=|x1−x2|+|y1−y2|+|z1−z2|d12=|x1−x2|+|y1−y2|+|z1−z2|

python实现为

def threeMHDdis(a,b):
return abs(a[0]-b[0])+abs(a[1]-b[1]) + abs(a[2]-b[2]) print 'a,b 三维曼哈顿距离为:', threeMHDdis((1,1,1),(2,2,2))

多维曼哈顿距离

多维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

 
d12=∑k=1n|x1k−x2k|d12=∑k=1n|x1k−x2k|

python实现为

def moreMHDdis(a,b):
sum = 0
for i in range(len(a)):
sum += abs(a[i]-b[i])
return sum print 'a,b 多维曼哈顿距离为:', moreMHDdis((1,1,1,1),(2,2,2,2))

由于维距离计算是比较灵活的,所以也同样适合二维和三维。

切比雪夫距离

切比雪夫距离(Chebyshev Distance)的定义为:max( | x2-x1 | , |y2-y1 | , … ), 切比雪夫距离用的时候数据的维度必须是三个以上,这篇文章中曼哈顿距离,欧式距离,明式距离,切比雪夫距离区别 给了一个很形象的解释如下:

比如,有同样两个人,在纽约准备到北京参拜天安门,同一个地点出发的话,按照欧式距离来计算,是完全一样的。

但是按照切比雪夫距离,这是完全不同的概念了。

譬如,其中一个人是土豪,另一个人是中产阶级,第一个人就能当晚直接头等舱走人,而第二个人可能就要等机票什么时候打折再去,或者选择坐船什么的。

这样来看的话,距离是不是就不一样了呢?

或者还是不清楚,我再说的详细点。

同样是这两个人,欧式距离是直接算最短距离的,而切比雪夫距离可能还得加上财力,比如第一个人财富值100,第二个只有30,虽然物理距离一样,但是所包含的内容却是不同的。

二维切比雪夫距离

二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离

 
d12=max(|x1−x2|,|y1−y2|)d12=max(|x1−x2|,|y1−y2|)

python 实现为

def twoQBXFdis(a,b):
return max( abs(a[0]-b[0]), abs(a[1]-b[1])) print 'a,b二维切比雪夫距离:' , twoQBXFdis((1,2),(3,4))

多维切比雪夫距离

两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的切比雪夫距离

 
d12=maxiϵn(|x1i−x2i|)d12=maxiϵn(|x1i−x2i|)

python 实现为

def moreQBXFdis(a,b):
maxnum = 0
for i in range(len(a)):
if abs(a[i]-b[i]) > maxnum:
maxnum = abs(a[i]-b[i])
return maxnum print 'a,b多维切比雪夫距离:' , moreQBXFdis((1,1,1,1),(3,4,3,4))

马氏距离

有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为

 
D(x)=(X−μ)TS−1(X−μ)−−−−−−−−−−−−−−−−−√D(x)=(X−μ)TS−1(X−μ)

而其中向量Xi与Xj之间的马氏距离定义为

 
D(Xi,Xj)=(Xi−Xj)TS−1(Xi−Xj)−−−−−−−−−−−−−−−−−−−−√D(Xi,Xj)=(Xi−Xj)TS−1(Xi−Xj)

若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:

 
D(Xi,Xj)=(Xi−Xj)T(Xi−Xj)−−−−−−−−−−−−−−−−−√D(Xi,Xj)=(Xi−Xj)T(Xi−Xj)

也就是欧氏距离了。

若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

马氏距离的优缺点:量纲无关,排除变量之间的相关性的干扰。

夹角余弦

几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。

二维空间向量的夹角余弦相似度

在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

 
cosθ=x1x2+y1y2x21+x22−−−−−−√y21+y22−−−−−−√cos⁡θ=x1x2+y1y2x12+x22y12+y22

python 实现为



修改为

def twoCos(a,b):
cos = (a[0]*b[0]+a[1]*b[1]) / (sqrt(a[0]**2 + a[1]**2) * sqrt(b[0]**2 + b[1]**2) ) return cos
print 'a,b 二维夹角余弦距离:',twoCos((1,1),(2,2))
  • 1
  • 2
  • 3
  • 4
  • 5

多维空间向量的夹角余弦相似度

两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦

类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

 
cosθ=a⋅b|a||b|cos⁡θ=a⋅b|a||b|

即:

 
cosθ=∑nk=1x1kx2k∑nk=1x21k−−−−−−−√∑nk=1x22k−−−−−−−√cos⁡θ=∑k=1nx1kx2k∑k=1nx1k2∑k=1nx2k2

python实现为

def moreCos(a,b):
sum_fenzi = 0.0
sum_fenmu_1,sum_fenmu_2 = 0,0
for i in range(len(a)):
sum_fenzi += a[i]*b[i]
sum_fenmu_1 += a[i]**2
sum_fenmu_2 += b[i]**2 return sum_fenzi/( sqrt(sum_fenmu_1) * sqrt(sum_fenmu_2) )
print 'a,b 多维夹角余弦距离:',moreCos((1,1,1,1),(2,2,2,2))

夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

闵可夫斯基距离

闵氏距离不是一种距离,而是一组距离的定义

定义

两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

 
∑k=1n|x1k−x2k|p−−−−−−−−−−−−√p∑k=1n|x1k−x2k|pp

其中p是一个变参数。

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

根据变参数的不同,闵氏距离可以表示一类的距离。

闵氏距离的缺点

闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。

举个例子:二维样本(身高,体重),其中身高范围是150 ~ 190,体重范围是50 ~ 60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

简单说来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

汉明距离

定义

两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。

应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

python 实现

def hanmingDis(a,b):
sumnum = 0
for i in range(len(a)):
if a[i]!=b[i]:
sumnum += 1
return sumnum print 'a,b 汉明距离:',hanmingDis((1,1,2,3),(2,2,1,3))

杰卡德距离 & 杰卡德相似系数

杰卡德距离

与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:

 
Jδ(A,B)=|A⋃B|−|A⋂B||A⋃B|Jδ(A,B)=|A⋃B|−|A⋂B||A⋃B|

杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

python 实现

def jiekadeDis(a,b):
set_a = set(a)
set_b = set(b)
dis = float(len( (set_a | set_b) - (set_a & set_b) ) )/ len(set_a | set_b)
return dis print 'a,b 杰卡德距离:', jiekadeDis((1,2,3),(2,3,4))

杰卡德相似系数

两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

 
J(A,B)=|A⋂B||A⋃B|J(A,B)=|A⋂B||A⋃B|

杰卡德相似系数是衡量两个集合的相似度一种指标。

python 实现

def jiekadeXSDis(a,b):
set_a = set(a)
set_b = set(b)
dis = float(len(set_a & set_b) )/ len(set_a | set_b)
return dis print 'a,b 杰卡德相似系数:', jiekadeXSDis((1,2,3),(2,3,4))

杰卡德相似系数与杰卡德距离的应用

可将杰卡德相似系数用在衡量样本的相似度上。

  样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。

p :样本A与B都是1的维度的个数

q :样本A是1,样本B是0的维度的个数

r :样本A是0,样本B是1的维度的个数

s :样本A与B都是0的维度的个数

那么样本A与B的杰卡德相似系数可以表示为:

这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。

而样本A与B的杰卡德距离表示为:

 
J=pp+q+rJ=pp+q+r

相关系数 & 相关距离

相关系数

 
ρXY=Cov(X,Y)D(X)−−−−−√D(Y)−−−−−√=E((X−EX)(Y−EY))D(X)−−−−−√D(Y)−−−−−√ρXY=Cov(X,Y)D(X)D(Y)=E((X−EX)(Y−EY))D(X)D(Y)

相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

python 实现 
相关系数可以利用numpy库中的corrcoef函数来计算 
例如 对于矩阵a,numpy.corrcoef(a)可计算行与行之间的相关系数,numpy.corrcoef(a,rowvar=0)用于计算各列之间的相关系数,输出为相关系数矩阵。

from numpy import  *
a = array([[1, 1, 2, 2, 3],
[2, 2, 3, 3, 5],
[1, 4, 2, 2, 3]]) print corrcoef(a) >>array([[ 1. , 0.97590007, 0.10482848],
[ 0.97590007, 1. , 0.17902872],
[ 0.10482848, 0.17902872, 1. ]]) print corrcoef(a,rowvar=0) >>array([[ 1. , -0.18898224, 1. , 1. , 1. ],
[-0.18898224, 1. , -0.18898224, -0.18898224, -0.18898224],
[ 1. , -0.18898224, 1. , 1. , 1. ],
[ 1. , -0.18898224, 1. , 1. , 1. ],
[ 1. , -0.18898224, 1. , 1. , 1. ]])

相关距离

 
Dxy=1−ρXYDxy=1−ρXY

python 实现(基于相关系数) 
同样针对矩阵a

# 行之间的相关距离
ones(shape(corrcoef(a)),int) - corrcoef(a) >>array([[ 0. , 0.02409993, 0.89517152],
[ 0.02409993, 0. , 0.82097128],
[ 0.89517152, 0.82097128, 0. ]]) # 列之间的相关距离
ones(shape(corrcoef(a,rowvar = 0)),int) - corrcoef(a,rowvar = 0) >>array([[ 0. , 1.18898224, 0. , 0. , 0. ],
[ 1.18898224, 0. , 1.18898224, 1.18898224, 1.18898224],
[ 0. , 1.18898224, 0. , 0. , 0. ],
[ 0. , 1.18898224, 0. , 0. , 0. ],
[ 0. , 1.18898224, 0. , 0. , 0. ]])

信息熵

信息熵并不属于一种相似性度量,是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。

计算给定的样本集X的信息熵的公式:

 
Entropy(X)=∑i=1n−pilog2piEntropy(X)=∑i=1n−pilog2pi

参数的含义:

n:样本集X的分类数

pi:X中第i类元素出现的概率

信息熵越大表明样本集S分类越分散,信息熵越小则表明样本集X分类越集中。。当S中n个分类出现的概率一样大时(都是1/n),信息熵取最大值log2(n)。当X只有一个分类时,信息熵取最小值0

python进行计算和实现可参考: 
http://blog.csdn.net/autoliuweijie/article/details/52244246

[转] MachingLearning中的距离相似性计算以及python实现的更多相关文章

  1. 余弦相似性计算及python代码实现

    A:西米喜欢健身 B:超超不爱健身,喜欢打游戏 step1:分词 A:西米/喜欢/健身 B:超超/不/喜欢/健身,喜欢/打/游戏 step2:列出两个句子的并集 西米/喜欢/健身/超超/不/打/游戏 ...

  2. postgis 中的距离计算

    最近在做一个项目,有一个功能想要实现类似于查询附近的人的功能.由于项目的原因数据库只能使用 postgresql,空间查询就使用了 postgis 来实现. 具体业务像这样:业务需要返回附近距自己 1 ...

  3. Solr In Action 笔记(2) 之 评分机制(相似性计算)

    Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 我们对搜索引擎进行查询时候,很少会有人进行翻页操作.这就要求我们对索引的内容提取具有高度的匹配性,这就搜索引擎文档的相似性 ...

  4. 7-10 社交网络图中结点的“重要性”计算(30 point(s)) 【并查集+BFS】

    7-10 社交网络图中结点的"重要性"计算(30 point(s)) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络 ...

  5. Leetcode——863.二叉树中所有距离为 K 的结点

    给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K . 返回到目标结点 target 距离为 K 的所有结点的值的列表. 答案可以以任何顺序返回. 示例 1: 输 ...

  6. .net中判断距离高考多长时间的js函数

    在JS中判断距离高考(此处举例高考)的时间函数 JS中代码: function djs() { var severtime= new Date(); //获取服务器日期 var year=severt ...

  7. PTA 社交网络图中结点的“重要性”计算(30 分)

    7-12 社交网络图中结点的“重要性”计算(30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互 ...

  8. Excel中最精确的计算年龄的公式

    身份证算年龄 假设A1是身份证号所在单元格 =IF(MONTH(NOW())<INT(MID(A1,11,2)),INT(YEAR(NOW())-INT(MID(A1,7,4)))-1,IF(M ...

  9. jQuery中height()不能精确计算的问题

    jQuery中关于高度的计算有三个方法:outerHeight().innerHeight().height() outerHeight():获取元素集合中第一个元素的当前计算高度值,包括paddin ...

随机推荐

  1. idea tomcat上传图片,无法显示的问题解决

    真是浪费时间啊,之前eclipse下的tomcat 去webapps下找就行了,这倒好,idea下根本没有. 我上传的目录建在项目中的static中了,upload文件夹,上传到这里肯定是找不到了的: ...

  2. gdb调试1--包括反汇编及文件编码设置

    一.编译 gcc的完整编译过程大致为:预处理->编译->汇编->链接 前三个步骤分别对应了-E.-S.-c三个选项. 编译阶段 命令 截断后的产物     C源程序 预处理 gcc ...

  3. Mysql错误 ERROR 1064 (42000): You have an error in your SQL syntax

    语法错误,可能有各种各样的问题. 我这个摔的太疼了. 字段名不能用空格..

  4. jackson用法

    ObjectMapper mapper=new ObjectMapper(); //3.调用mapper的writeValueAsString()方法把一个对象或集合转为json字符串 Custome ...

  5. grafana-zabbix部署和使用

    grafana-zabbix安装 官网安装介绍地址:https://grafana.com/plugins/alexanderzobnin-zabbix-app/installation 下载地址:h ...

  6. sql 各种常用函数

    1.stuff函数 替换制定字符串 stuff(,,'许嵩') 结果: 最帅的许嵩最帅的我 2.replace函数 select replace('蜀云泉真是帅啊','蜀云泉','许嵩') 结果: 许 ...

  7. JavaSE学习总结(七)—— 集合

    一.为什么需要集合 如果要将100个学生成绩存放到程序中,怎么做? 首先想到是数组 int[] scores=new int[100]; 然而,长度是固定的,比如是101个学生成绩,这个数组就不能用了 ...

  8. .Net进阶系列(10)-异步多线程综述(被替换)

    一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...

  9. rest framework错误笔记——身份验证和权限

    按照官网教程(http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/)走到最后一步验证时,命令窗 ...

  10. NOI2018场外游记

    鬼晓得APIO以后我经历了些什么 Day 0 好像没什么要记的 Day 1 下午去参加开幕式 神tm大型落地柜装风扇空调下放冰块 开幕式,,,hot chocolate是真的hot(强制在线?卡常?) ...