1. 距离计算方式

1.1 欧式距离(直线距离)

马氏距离r语言代码 马氏距离计算_协方差

 和 

马氏距离r语言代码 马氏距离计算_马氏距离r语言代码_02

 分别为两个n维向量,距离计算公式为:

马氏距离r语言代码 马氏距离计算_距离计算_03

当不同维度的量纲不一致时,量纲大的维度权重会变大,解决方式为:

    1). 向量归一化

    2). 欧式距离标准化。其中

马氏距离r语言代码 马氏距离计算_余弦相似度_04

为第i个维度的标准差(根据整个数据集计算)         

马氏距离r语言代码 马氏距离计算_余弦相似度_05

    3). 马氏距离

        欧式距离:

马氏距离r语言代码 马氏距离计算_余弦相似度_06

        马氏距离:

马氏距离r语言代码 马氏距离计算_距离计算_07

        

马氏距离r语言代码 马氏距离计算_协方差_08

表示xy之间的协方差矩阵。

       优点:它不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关。马氏距离还可以排除变量之间的相关性的干扰。 

       缺点:夸大了变化微小的变量的作用。受协方差矩阵不稳定的影响,马氏距离并不总是能顺利计算出。

1.2 曼哈顿距离(街区距离)

马氏距离r语言代码 马氏距离计算_协方差

 和 

马氏距离r语言代码 马氏距离计算_马氏距离r语言代码_02

 分别为两个n维向量,距离计算公式为:

马氏距离r语言代码 马氏距离计算_余弦相似度_11

1.3 切比雪夫距离

马氏距离r语言代码 马氏距离计算_协方差_12

1.4 明氏距离

明氏距离是欧氏距离的推广,是对多个距离度量公式的概括性的表述。p=1退化为曼哈顿距离;p=2退化为欧氏距离切比雪夫距离是明氏距离取极限的形式。公式为:

马氏距离r语言代码 马氏距离计算_距离计算_13

下图给出了一个Lp球的形状随着P的减少的可视化图:

马氏距离r语言代码 马氏距离计算_距离计算_14

1.5 汉明距离

定义:在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。

场景:在海量物品的相似度计算中可用simHash对物品压缩成字符串,然后使用海明距离计算物品间的距离

2. 相似度计算方式

2.1 余弦相似度

余弦相似度表示两个向量之间夹角的余弦值,向量夹角越小,余弦值越大,越相似。

马氏距离r语言代码 马氏距离计算_协方差_15

缺点:只能分辨个体在维之间的差异,没法衡量每个维数值的差异(比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性)

修正后的余弦相似度,ai表示所有向量在第i个维度上的均值。

马氏距离r语言代码 马氏距离计算_马氏距离r语言代码_16

2.2 皮尔逊相关系数

协方差表示两个变量的变化趋势,当两个变量变化趋势相同时,协方差为正值,变化趋势相反时,协方差为负值。

马氏距离r语言代码 马氏距离计算_距离计算_17

虽然协方差能反映两个随机变量的相关程度(协方差大于0的时候表示两者正相关,小于0的时候表示两者负相关),但其数值上受量纲的影响很大,不能简单地从协方差的数值大小给出变量相关程度的判断。

为了消除这种量纲的影响,皮尔逊相关系数用两个变量的协方差除以它们的标准差得到:

马氏距离r语言代码 马氏距离计算_余弦相似度_18

2.3 杰卡德相关系数

衡量两个集合之间的相似度,关心集合之间共同拥有的个体这一问题。

马氏距离r语言代码 马氏距离计算_协方差_19

Jaccard相关系数只能用于布尔值度量,无法用户实数值之间的差异。

广义Jaccard距离:

马氏距离r语言代码 马氏距离计算_距离计算_20

2.4 KL散度

衡量两个取值为正的函数分布之间的相似性。

马氏距离r语言代码 马氏距离计算_马氏距离r语言代码_21