Python学习与机器学习 各类距离与Python的具体实现

两个向量之间的距离(此时向量作为n维向量坐标系中的点)计算,在数学上称为向量的距离(Distance),也称为样本之间的相似性度量(Similarity Measurement)。它反映为某类事物在距离上接近或远离的程度。直觉上,距离越近,越容易归为一类;距离越远就越不同。划分的依据,称为距离。

Python学习与机器学习 各类距离与Python的具体实现

范数(数学基础)

向量的范数可以简单、形象地理解为向量的长度,或者向量到坐标系原点的距离,或者相应空间内的两点之间的距离。
向量的范数定义: 向量的范数是一个函数||x||,满足非负性||x||>0,齐次性||cx||=|c|*||x||,三角不等式||x+y||<=||x||+||y||.

L1范数: ||x||为x向量各个元素绝对值之和。
L2范数: ||x||为x向量各个元素平方和的开方,L2范数又称欧几里得范数。
Lp范数: ||x||为x向量各个元素绝对值的p次方和的1/p次方。
L无穷范数: ||x||为x向量各个元素绝对值最大的那个元素。

各类距离的意义与Pyhon实现

这里介绍的几种距离公式如下:

闵可夫斯基距离 (Minkowski Distance)
欧式距离 (Euclidean Distance)
曼哈顿距离 (Manhattan Distance)
切比雪夫距离 (Chebyshew Distance)
夹角余弦 (Cosine)
汉明距离 (Hamming Distance)
杰卡德相似系数 (Jaccard Similarity Coefficient)

1.闵可夫斯基距离 (Minkowski Distance)

严格意义上讲,闵可夫斯基距离不能算是一种距离,而是一组距离的定义。
设有两个n维向量A(x1,x2,x3,….xn)和B(y1,y2,y3,….yn)间的闵可夫斯基距离定义为:

其中p是一个参数。
当p=1时,就是曼哈顿距离;
当p=2时,就是欧式距离;
当p->无穷时,就是切比雪夫距离。

2.欧式距离 (Euclidean Distance)

欧式距离(L2范数)是最易于理解的一种距离计算方法,源于欧式空间中两点间的距离公式。两个n维向量A(x1,x2,x3,…xn)和B(y1,y2,y3,…..yn)间的欧式距离:

Python实现欧式距离:
from numpy import *

vector1=mat([1,2,3])
vector2=mat([4,5,6])

print sqrt((vector1-vector2)*(vector1-vector2).T)

3.曼哈顿距离 (Manhattan Distance)

曼哈顿距离也称城市街区距离(City Block Distance),也就是L1范数。
二维平面两点A(x1,y1)和B(x2,y2)间的曼哈顿距离为:
d=|x2-x1|+|y2-y1|
两个n维向量A(x1,x2,x3,…xn)和B(y1,y2,y3,….yn)间的曼哈顿距离为:

Python实现曼哈顿距离:
from numpy import *
vector1=mat([1,2,3])
vector2=mat([4,5,6])
print sum(abs(vector1-vector2))

4.切比雪夫距离 (Chebyshew Distance)

国际象棋中,国王每走一步能够走到相邻的8个方格中的任意一个,那么国王从A(x1,y1)走到B(x2,y2)最少需要多少步?最少步数总是max(|x2-x1|,|y2-y1|)步。类似的距离度量方法叫做切比雪夫距离(L无穷范数)。

n维向量A(x11,x12,x13,….x1n)和B(x21,x22,x23,….x2n)间的切比雪夫距离:

它的另一种等价形式为:

Python实现切比雪夫距离:
from numpy import *

vector1=mat([1,2,3])
vector2=mat([4,7,6])
print abs(vector1-vector2).max()

5.夹角余弦 (Cosine)

几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中用这一概念衡量样本向量之间的差异。
两个n维样本点A(x11,x12,x13,…x1n)与B(x21,x22,x23,…x2n)的夹角余弦:类似地,对于两个样本点A(x11,x12,x13,…x1n)与B(x21,x22,x23,…x2n),可以使用类似夹角余弦的概念来衡量他们间的相似程度。


python 实现向量夹角

from numpy import *

vector1=mat([1,2,3])
vector2=mat([4,7,6])

cosV12=dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))
print cosV12

6.汉明距离 (Hamming Distance)

汉明距离的定义:两个登场字符串s1和s2之间的汉明距离定义为将其中一个变为另外一个所需要的最小替换次数。
应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)

Python实现汉明距离

from numpy import *
matV=mat([1,1,0,1,1,0,1],[1,0,1,0,1,0,1])
smstr=nonzero(matV[0]-matV[1])
print shape(smstr[0]) [1]

7.杰卡德相似系数 (Jaccard Similarity Coefficient)

两个集合A和B的交集元素在A、B的并集中所占的比率,称为两个集合的杰卡德相似系数。

杰卡德相似系数是衡量两个集合相似度的一种指标。
杰卡德距离:与杰卡德相似系数相反的概念是杰卡德距离。

Python实现杰卡德距离
from numpy import *
import scipy.spatial.distance as dist #导入Scipy距离公式
matV=mat([1,1,0,1,0,1,0,0,1],[0,1,0,1,0,1,0,1,0])
print “dist.jaccard:”,dist.pdist(matV,’jaccard’)

1