欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

关于相似性度量与各类距离的意义

发布时间:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 关于相似性度量与各类距离的意义 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

        两个向量之间的距离计算,在数学上称为向量的距离,也称为样本之间的相似性度量(Similarity Meansurement)。它反映为某类事物在距离上接近或远离的程度。

  • 范数

  • 闵可夫斯基距离
  • 欧氏距离
  • 曼哈顿距离
  • 切比雪夫距离
  • 夹角余弦
  • 海明距离
  • 杰卡德相似系数

特征间的相关性

  • 相关系数与相关距离
  • 马氏距离

范数

        在数学的学习,我们肯定都接触过范数的这个概念,下面是对范数的介绍:

范数:向量的范数可以简单、形象地理解为向量的长度,或者向量到坐标原点的距离,或者相应空间内的两点之间的距离。

向量的范数定义:向量的范数是一个函数||x||,满足非负性||x||>=0,齐次性||cx||=|c| ||x||,三角不等式||x+y||<=||x||+||y||。

下面是对范数的解释:

L1范数:||x||为x向量各个元素绝对值之和。

L2范数:||x||为x向量各个元素平方和的开方。L2范数又称Euclidean范数或者Frobenius范数。

Lp范数:||x||为x向量各个元素绝对值p次方和的1/p次方。

L∞范数:||x||为x向量各个元素绝对值最大的那个元素,如下:

            

 向量范数的运算(使用线性代数库linalg):

b = [2, 6, 4] a1 = np.linalg.norm(b) # 当p值不指定时,默认值为2,为L2范数 a2 = np.linalg.norm(b, 1) a3 = np.linalg.norm(b, 2) a4 = np.linalg.norm(b, 3) a5 = np.linalg.norm(b, np.inf) print(a1) print(a2) print(a3) print(a4) print(a5)

结果为:

7.48331477355 12.0 7.48331477355 6.60385449779 6.0Process finished with exit code 0

闵可夫斯基距离(Mindkowski Distance)

严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义。

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

                

其中p是一个变参数。

  • 当p=1时,就是曼哈顿距离。
  • 当p=2时,就是欧氏距离。
  • 当p—>∞时,就是切比雪夫距离。

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

欧式距离(Euclidean Distance)

         欧式距离可以理解为L2范数。

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

            

(2)三维空间两点A(x1, y1, z1)与B(x2, y2, z2)间的欧式距离:

            

(3)两个n维向量A(x11, x12, ..., x1n)与B(x21, x22, ..., x2n)间的欧式距离:

            

表示向量运算的形式:

            

用程序实现欧式距离:

import numpy as np vectorA = np.mat([3, 4, 7]) vectorB = np.mat([3, 8, 5]) print(np.sqrt((vectorA-vectorB)*(vectorA-vectorB).T))

结果为:

[[ 4.47213595]]Process finished with exit code 0

曼哈顿距离(Manhattan Distance)

曼哈顿距离可以理解为L1范数

        曼哈顿距离的命名原因是从规划为方型建筑区块的城市(如曼哈顿)间,最短的行车路径而来(忽略曼哈顿的单向车道以及只存在于3、14大道的斜向车道)。任何往东三区块、往北六区块的的路径一定最少要走九区块,没有其他捷径。

(1)二维平面两点A(x1, y1)与B(x2, y2)间的曼哈顿距离:

            

(2)两个n维向量A(x11, x12, ..., x1n)与B(x21, x22, ..., x2n)间的曼哈顿距离:

            

程序实现曼哈顿距离:

import numpy as np vectorA = np.mat([3, 4, 7]) vectorB = np.mat([3, 8, 5]) print(np.sum(np.abs(vectorA-vectorB)))

结果为:

6Process finished with exit code 0

切比雪夫距离(Chebyshev Distance)

        在国际象棋中,国王走一步能够移动到相邻的8个方格中的任意一个。国王从格子(x1, y1)走到格子(x2, y2)最少需要的步数总是max(|x2-x1|, |y1-y2)步。该距离度量的方法与切比雪夫距离类似,切比雪夫距离相当于L∞范数。

(1)二维平面两点A(x1, y1)与B(x2, y2)间的切比雪夫距离:

            

(2)两个n维向量A(x11, x12, ..., x1n)与B(x21, x22, ..., x2n)间的切比雪夫距离:

            

这个公式的另一种等价形式是:

            

程序实现切比雪夫距离:

import numpy as np vectorA = np.mat([3, 4, 7]) vectorB = np.mat([3, 8, 5]) print(np.max(np.abs(vectorA-vectorB)))

结果为:

4Process finished with exit code 0

夹角余弦(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。

程序实现:

import numpy as np vectorA = np.array([3, 4, 7]) vectorB = np.array([3, 8, 5]) cosV = np.dot(vectorA, vectorB)/(np.linalg.norm(vectorA)*np.linalg.norm(vectorB)) print(cosV)

结果为:

0.892451645372Process finished with exit code 0

海明距离(Hamming Distance)

        在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离。

        例如:字符串“1111”与“1001”之间的海明距离为2。

        主要应用在信息编码,为了增强容错性,应使得编码间的最小Hamming Distance尽可能大。

程序实现:

import numpy as np vectorA = np.mat([1, 0, 1, 0, 1, 1, 1, 0]) vectorB = np.mat([0, 1, 1, 1, 0, 0, 1, 0])non = np.nonzero(vectorB-vectorA) print(len(non[0]))

结果为:

5Process finished with exit code 0

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

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

        杰卡德相似系数是衡量两个集合的相似度的一种指标,可用在衡量样本的相似度上。

(2)杰卡德距离:与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance)。

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

程序实现(使用scipy中的距离函数):

import numpy as np import scipy.spatial.distance as dist vectorA = [1, 0, 1, 0, 1, 1, 1, 0] vectorB = [0, 1, 1, 1, 0, 0, 1, 0] # A∪B为[1, 1, 1, 1, 1, 1, 1, 0] 和为7 # A∩B为[0, 0, 1, 0, 0, 0, 1, 0] 和为2 vector = np.mat([vectorA, vectorB]) print(dist.pdist(vector, metric='jaccard'))

结果为:

[ 0.71428571]Process finished with exit code 0

特征间的相关性

相关系数(Correlation Coefficient)与相关距离(Correlation Distance)

(1)相关系数的定义:

相关系数是衡量两个特征列之间相关程度的一种方法,其取值范围是[-1, 1]。相关系数的绝对值越大,表明特征列X与Y的相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

(2)相关距离的定义:

相关系数的程序实现:

import numpy as np vector1 = [2639, 1881, 1542, 1529, 2730, 2042, 2045, 1807, 2111, 1916, 2110, 1541, 1634, 1477, 2197, 1886, 1783,1625, 1521, 1146, 865, 2229, 1651, 1399, 1760, 1362, 1789, 1631, 1512, 1876, 2031] # 衣着消费 vector2 = [3696, 2254, 1204, 1506, 1972, 1844, 1643, 1217, 3724, 3078, 2997, 1933, 2105, 1487, 1656, 1525, 1652,1738, 2954, 1626, 1320, 1471, 1587, 1396, 1434, 550, 2079, 1388, 1097, 1516, 1281] # 文教娱乐消费 v1_mean = np.mean(vector1) v2_mean = np.mean(vector2)dv1 = np.std(vector1) dv2 = np.std(vector2) corref = np.mean(np.multiply(vector1-v1_mean, vector2-v2_mean))/(dv1*dv2) print(corref) # 使用Numpy相关系数得到相关系数矩阵 print(np.corrcoef(vector1, vector2))

结果为:

0.470486874287 [[ 1. 0.47048687][ 0.47048687 1. ]]

相关系数矩阵的含义是:如果把第一个特征列作为参照数据(自己与自己的相关系数为1),那么第二个与第一个的相关程度是47%。

马氏距离(Mahalanobis Distance)

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

它是用坐标差平方除以方差(或者说乘以方差的倒数),从而转化为无量纲数的,推广到多维就是要乘以协方差阵的逆矩阵,这就是马氏距离的概念。

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

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

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

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

程序实现:

import numpy as np vector1 = [2639, 1881, 1542, 1529, 2730, 2042, 2045, 1807, 2111, 1916, 2110, 1541, 1634, 1477, 2197, 1886, 1783,1625, 1521, 1146, 865, 2229, 1651, 1399, 1760, 1362, 1789, 1631, 1512, 1876, 2031] # 衣着消费 vector2 = [3696, 2254, 1204, 1506, 1972, 1844, 1643, 1217, 3724, 3078, 2997, 1933, 2105, 1487, 1656, 1525, 1652,1738, 2954, 1626, 1320, 1471, 1587, 1396, 1434, 550, 2079, 1388, 1097, 1516, 1281] # 文教娱乐消费 vector = np.mat([vector1, vector2])S_1 = np.linalg.inv(np.cov(vector)) v = vector.T[0] - vector.T[1] distMa = np.sqrt(np.dot(np.dot(v, S_1), v.T)) print(distMa)

结果为:

[[ 2.27405171]]Process finished with exit code 0

 

 

参考:

1.机器学习算法原理与编程实践/郑捷著. 北京:电子工业出版社,2015.11

转载于:https://my.oschina.net/u/3888421/blog/2231617

总结

以上是生活随笔为你收集整理的关于相似性度量与各类距离的意义的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。