MachingLearning中的距离和相似性计算以及python实现
图像的画法:距离原点的距离都是一样的
p=1时:所有点到原点的距离均为1
p=2时:所有点到原点的距离均为1
p=无穷时:所有点到原点的距离均为1
欧氏距离
也称欧几里得距离,是指在m维空间中两个点之间的真实距离。欧式距离在ML中使用的范围比较广,也比较通用,就比如说利用k-Means对二维平面内的数据点进行聚类,对魔都房价的聚类分析(price/m^2 与平均房价)等。
两个n维向量 a ( x 11 , x 12 . . . . . x 1 n ) a(x_{11},x_{12}.....x_{1n}) a(x11,x12.....x1n)与 b ( x 21 , x 22 . . . . . x 2 n ) b(x_{21},x_{22}.....x_{2n}) b(x21,x22.....x2n)间的欧氏距离
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))
这里传入的参数可以是任意维的,该公式也适应上边的二维和三维
曼哈顿距离
D 12 = ∑ k = 1 n ∣ x 1 k − x 2 k ∣ D_{12}=\sum_{k=1}^{n}|x_{1k}-x_{2k}| D12=k=1∑n∣x1k−x2k∣
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))
切比雪夫距离
切比雪夫距离(Chebyshev Distance)的定义为:$max( | x_2-y_2 | , |x_1-y_1 | , … ), 其 中 其中 其中x,y$均为向量
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个样本向量
X
1
,
.
.
.
,
X
m
X_1,...,X_m
X1,...,Xm,协方差矩阵记为
S
S
S,均值记为向量
μ
μ
μ,则其中样本向量
X
X
X到
μ
μ
μ的马氏距离表示为
D
(
x
)
=
(
X
−
μ
)
T
S
−
1
(
X
−
μ
)
D(x)=\sqrt {(X-μ)^TS^{-1}(X-μ)}
D(x)=(X−μ)TS−1(X−μ)
马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为
Σ
Σ
Σ的随机变量之间的差异程度。
如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也可称为正规化的欧氏距离。
夹角余弦
c o s θ = a ∗ b ∣ a ∣ ∣ b ∣ c o s θ = ∑ k = 1 n x 1 k x 2 k ∑ k = 1 n x 1 k 2 ∑ k = 1 n x 2 k 2 cos \theta = \frac {a*b} {|a||b|} \\cos \theta = \frac {\sum_{k=1}^{n}x_{1k}x_{2k}} {\sqrt {\sum_{k=1}^{n}x_{1k}^2}\sqrt {\sum_{k=1}^{n}x_{2k}^2}} cosθ=∣a∣∣b∣a∗bcosθ=∑k=1nx1k2∑k=1nx2k2∑k=1nx1kx2k
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))
闵可夫斯基距离
p ∑ k = 1 n ∣ x 1 k − x 2 k ∣ p p\sqrt{\sum_{k=1}^{n}|x_{1k}-x_{2k}|^p} pk=1∑n∣x1k−x2k∣p
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
汉明距离
两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数
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))
杰卡德距离 & 杰卡德相似系数
杰卡德距离,杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
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)表示。
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))
相关系数 & 相关距离
相关 系数
信息熵
衡量分布的混乱程度或分散程度的一种度量.
测地距离(Geodesic Distance)
“geodesic”(测地线) 一词来源于 geodesy(测地学), 是一门测量地球大小和形状 的学科。 就从 geodesic的本意来说, 就是地球表面两点之间的最短路径。 Geodesic Distance 就是图中两节点的最短路径。几何空间通常用到的 Euclidean Distance(欧氏距离) , 即两点之间的最短距离, 两者有所区别。