常用的距离测度方法有:欧式距离,闵可夫斯基距离,曼哈顿距离,马式距离等。除马式距离外,R语言中的philentropy包基本上都满足了学者进行距离测度的需求。本次除介绍philentropy包外,另外介绍马式距离的R语言中的实现函数,以供所需的同学查阅自取。

1.mahalanobis马式距离

#


关于python中马氏距离的实现,请参考:

在R中是否有相当于Mahalanobis()函数的Python?如果没有,我如何实现它? - 问答 - 云+社区 - 腾讯云cloud.tencent.com


2.philentropy包

philentropy包实现了46个不同距离算法和相似性度量,通过不同数据的相似度比较,为基础研究提供了科学基础


#


给出上述46种距离测度名称的含义

1euclidean:欧式距离,是一个通用距离计算规则,在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。

2manhattan:曼哈顿距离,用于几何空间度量,表示两个点在标准坐标系上的绝对轴距距离总和。

3minkowski:闵可夫斯基距离,是欧氏空间中的广义距离函数,其参数p值的不同代表着对空间不同的度量。

4chebyshev:切比雪夫距离,是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。

5sorensen:测量每个样本单位,对单位总数的距离测量贡献度。

6gower:高尔距离,将向量空间缩放为规范化空间,可计算逻辑值,数字,文本的距离,距离结果为0到1之间的数字。

7soergel:测量每个样本单位,对最大值总数的距离测量贡献度。

8kulczynski:与soergel相反,测量每个样本单位,对最小值总数的距离测量贡献度。

9canberra:堪培拉距离,是矢量空间中的点对之间的距离的数值度量,它是L_1距离的加权版本。

10lorentzian:洛伦兹距离,绝对的差异并应用自然对数。

11intersection:交叉距离,最小轨道交叉距离,是天文学中用于评估天文物体之间潜在的近距离接近和碰撞风险的度量。它被定义为两个物体的密切轨道的最近点之间的距离。

12non-intersection:非交叉距离

13wavehedges:波浪距离

14czekanowski:d = ∑ | P_i - Q_i | / ∑ | P_i + Q_i |

15motyka:莫蒂卡方程,是czekanowski的一半。

16kulczynski_s:d = 1 / ∑ | P_i - Q_i | / ∑ min(P_i , Q_i)

17tanimoto:是标准化内积的另一种变体。

18ruzicka:

s = ∑ min(P_i , Q_i) / ∑ max(P_i , Q_i)

19inner_product:内部产品空间,计算两个向量的内积产生标量,有时称为标量积或点积。

20harmonic_mean:调和平均值。

21cosine:余弦距离,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。

22hassebrook(PCE):利用P•Q来测量能量的峰值,简称PCE。

23jaccard:杰卡德距离,用于计算样本间的相似度,分子是A和B的交集大小,分母是A和B的并集大小。

24dice:骰子

25fidelity:保真度,在量子信息理论中,保真度是两个量子态“接近”的度量。

26bhattacharyya:巴氏距离,测量两个概率分布的相似性。

27hellinger:海林格,用来度量两个概率分布的相似度,它是F散度的一种。

28matusita:

  • d = sqrt( 2 - 2 * ∑ sqrt(P_i * Q_i))

29squared_chord:

  • d = ∑ ( sqrt(P_i) - sqrt(Q_i) )^2

30squared_euclidean:欧式距离的平方

31pearson:皮尔森距离,分子是两个集合的交集大小,分母是两个集合大小的几何平均值,是余弦距离的一种变型。

32neyman:奈曼

33squared_chi:

  • d = ∑ ( (P_i - Q_i )^2 / (P_i + Q_i) )

34prob_symm:

  • d = 2 * ∑ ( (P_i - Q_i )^2 / (P_i + Q_i) )

35divergence:散度,

36clark:克拉克,

37additive_symm:算术和几何平均散度.

38kullback-leibler:KL散度,用于计算相熵或信息偏差,是衡量两个分布(P、Q)之间的距离,越小越相似。

39jeffreys:杰弗里斯,J分歧。

40k_divergence:K散度,

41topsoe:托普索,是k_divergence加法的对称形式。

42jensen-shannon:詹森香农,是topsoe距离的一半。

43jensen_difference:

  • d = 2 * ∑ ( (P_i - Q_i )^2 / (P_i + Q_i) )

44taneja:塔内加,计算算术和几何平均偏差。

45kumar-johnson:库马尔-约翰逊,

46avg:平均值

计算距离


##函数形式
#distance(x, method = "euclidean", p = NULL, test.na = TRUE,
  unit = "log", est.prob = NULL)


参数列表:

  • x: 数值类型的向量或数据集
  • method,:算法的名称
  • p:minkowski闵可夫斯基距离的p值,p=1为曼哈顿距离,p=2为欧氏距离,p取极限时是切比雪夫距离
  • test.na: 检测数据集是否有NA值,不检测为FALSE,计算会快。
  • unit:对数化的单位,依赖于日志计算的距离
  • est.prob:从计数估计概率,默认值为NULL

举例:


test=read.csv('..test.csv')
distance(test, method = "euclidean", p = NULL, test.na = TRUE,
  unit = "log", est.prob = NULL)
###以下为结果
Metric: 'euclidean'; comparing: 5 vectors.
         v1       v2       v3       v4       v5
v1  0.00000 69.07243 56.11595 33.30165 78.16649
v2 69.07243  0.00000 14.07125 36.68787 12.04159
v3 56.11595 14.07125  0.00000 23.10844 22.29350
v4 33.30165 36.68787 23.10844  0.00000 45.02222
v5 78.16649 12.04159 22.29350 45.02222  0.00000


参考文献:

在R中是否有相当于Mahalanobis()函数的Python?如果没有,我如何实现它? - 问答 - 云+社区 - 腾讯云