随笔 - 1264  文章 - 0 评论 - 15 trackbacks - 0

数学中有非常多不同种类的距离,经常使用于几何、高等代数等数学研究。

多种多样的距离在数学建模、计算机学习中有着不小的应用。

比方,A*搜索时的评估函数。

比方,在机器学习中,做分类时经常须要估算不相同本之间的类似性度量(Similarity Measurement)。这时通常採用的方法就是计算样本间的距离。採用什么样的方法计算距离是非常讲究。甚至关系到分类的正确与否。

欧氏距离(Euclidean Distance)

欧氏距离是最易于理解的一种距离计算方法,源自欧几里得几何中两点间的距离公式。

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

这里写图片描写叙述

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

这里写图片描写叙述

也能够用表示成向量运算的形式:

这里写图片描写叙述

(4)Matlab计算欧氏距离

Matlab计算距离主要使用pdist函数。

X是一个M×N的矩阵。则pdist(X)将X矩阵M行的每一行作为一个N维向量。然后计算这M个向量两两间的距离。

样例:计算向量(0,0)(1,0)(0,2)两两间的欧式距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X,'euclidean') %大家能够去查一查pdist的參数

结果:

D =

    1.0000    2.0000    2.2361

曼哈顿距离(Manhattan Distance)

从名字就能够猜出这样的距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。

实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)。

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

这里写图片描写叙述

(2)两个n维向量a(x11,x12,,x1n)b(x21,x22,,x2n)间的曼哈顿距离

这里写图片描写叙述

(3) Matlab计算曼哈顿距离

样例:计算向量(0,0)(1,0)(0,2)(2,2)两两间的曼哈顿距离

X = [0 0 ; 1 0 ; 0 2 ; 2 2];

D = pdist(X,'cityblock')

结果:

D =

     1     2     4     3     3     2

切比雪夫距离 ( Chebyshev Distance )

国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的随意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少须要多少步?自己走走试试。

你会发现最少步数总是max( | x2-x1 | , | y2-y1 | ) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。

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

这里写图片描写叙述

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

这里写图片描写叙述

  这个公式的还有一种等价形式是

这里写图片描写叙述

看不出两个公式是等价的?提示一下:试试用放缩法和夹逼法则来证明。

(3)Matlab计算切比雪夫距离

样例:计算向量(0,0)(1,0)(0,2)两两间的切比雪夫距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'chebychev')

结果:

D =

     1     2     2

闵可夫斯基距离(Minkowski Distance)

闵氏距离不是一种距离。而是一组距离的定义,上文说的几个距离都是属于闵可夫斯基距离的。

(1) 闵氏距离的定义

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

这里写图片描写叙述

当中p是一个变參数。

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

p=2时,就是欧氏距离

p时,就是切比雪夫距离

依据变參数的不同。闵氏距离能够表示一类的距离。

(2)闵氏距离的缺点

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

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

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

(3)Matlab计算闵氏距离

样例:计算向量(0,0)(1,0)(0,2)两两间的闵氏距离(以变參数为2的欧氏距离为例)

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X,'minkowski',2)

结果:

D =

    1.0000    2.0000    2.2361

标准化欧氏距离 (Standardized Euclidean distance )

(1)标准欧氏距离的定义

标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。

标准欧氏距离的思路:既然数据各维分量的分布不一样。那先将各个分量都“标准化”到均值、方差相等。

均值和方差标准化到多少呢?这里先复习点统计学知识吧。如果样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:

X=Xms

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

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

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

这里写图片描写叙述

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

(2)Matlab计算标准化欧氏距离

样例:计算向量(0,0)(1,0)(0,2)两两间的标准化欧氏距离 (如果两个分量的标准差分别为0.5和1)

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'seuclidean',[0.5,1])

结果:

D =

    2.0000    2.0000    2.8284

马氏距离(Mahalanobis Distance)

(1)马氏距离定义

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

这里写图片描写叙述

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

这里写图片描写叙述

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

这里写图片描写叙述

也就是欧氏距离了。

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

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

(3) Matlab计算(1,2)(1,3)(2,2)(3,1)两两之间的马氏距离

X = [1 2; 1 3; 2 2; 3 1]

Y = pdist(X,'mahalanobis')



结果:

Y =

    2.3452    2.0000    2.3452    1.2247    2.4495    1.2247

夹角余弦(Cosine)

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

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

这里写图片描写叙述

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

这里写图片描写叙述

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

  即:

这里写图片描写叙述

夹角余弦取值范围为[1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。

当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向全然相反夹角余弦取最小值-1。

(3)Matlab计算夹角余弦

样例:计算(1,0)(1,1.732)(1,0)两两间的夹角余弦

X = [1 0 ; 1 1.732 ; -1 0]

D = 1- pdist(X, 'cosine')  % Matlab中的pdist(X, 'cosine')得到的是1减夹角余弦的值

结果:

D =

    0.5000   -1.0000   -0.5000

汉明距离(Hamming distance)

(1)汉明距离的定义

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

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

作为北邮的学生,这个算的就是比較多吧。

(2)Matlab计算汉明距离

Matlab中2个向量之间的汉明距离的定义为2个向量不同的分量所占的百分比。

样例:计算向量(0,0,0)(0,0,1)(0,1,0)(1,0,0)(0,1,1)两两间的汉明距离

X = [0 0 0 ; 0 0 1 ; 0 1 0 ; 1 0 0 ; 0 1 1];

D = pdist(X,'hamming')

结果:

D =

    0.3333    0.3333    0.3333    0.6667    0.6667    0.6667    0.3333    0.6667    0.3333    1.0000

杰卡德类似系数(Jaccard similarity coefficient)

(1) 杰卡德类似系数

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

这里写图片描写叙述

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

(2) 杰卡德距离

与杰卡德类似系数相反的概念是杰卡德距离(Jaccard distance)。

杰卡德距离可用例如以下公式表示:

这里写图片描写叙述

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

(3) 杰卡德类似系数与杰卡德距离的应用

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

样本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的维度的个数

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

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

这里写图片描写叙述

(4)Matlab 计算杰卡德距离

Matlab的pdist函数定义的杰卡德距离跟我这里的定义有一些区别,Matlab中将其定义为不同的维度的个数占“非全零维度”的比例。

样例:计算(1,1,0)(1,1,0)(1,1,0)两两之间的杰卡德距离

X = [1 1 0; 1 -1 0; -1 1 0]

D = pdist( X , 'jaccard')

结果

D =

0.5000    0.5000    1.0000

相关系数 ( Correlation coefficient )与相关距离(Correlation distance)

(1) 相关系数的定义

这里写图片描写叙述

相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。

当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

(2)相关距离的定义

这里写图片描写叙述

(3)Matlab计算(1,2,3,4)(3,8,7,6)之间的相关系数与相关距离

X = [1 2 3 4 ; 3 8 7 6]

C = corrcoef( X' )   %将返回相关系数矩阵

D = pdist( X , 'correlation')

结果:

C =

    1.0000    0.4781

    0.4781    1.0000

D =

0.5219

      当中0.4781就是相关系数,0.5219是相关距离。

posted on 2017-08-18 09:36  lxjshuju  阅读(4502)  评论(1编辑  收藏