本文介绍了12种常用的距离度量原理、优缺点、应用场景,以及基于Numpy和Scipy的Python实现代码。

笔记工具:Notability


文章目录

  • 1. 个人笔记
  • 2. 代码实现
    • 1)闵可夫斯基距离(Minkowski Distance)
    • 2) 欧氏距离(Euclidean Distance)
    • 3) 曼哈顿距离(Manhattan/City Block Distance)
    • 4) 切比雪夫距离(Chebyshev Distance)
    • 5) 余弦相似度(Cosine Similarity)
    • 6) 汉明距离(Hamming Distance)
    • 7) 杰卡德距离(Jaccard Distance)
    • 8) S Φ rensen-Dice
    • 9) 半正矢距离(Haversine Distance)
    • 10) 斜交空间距离(Oblique Space Distance)
    • 11) 兰氏距离(Canberra Distance)
    • 12) 马氏距离(Mahalanobis Distance)

1. 个人笔记

笔记工具:Notability

笔记获取:

  1. 公众号: datazero 回复:DM 获取下载地址。(主页左侧边栏扫码)
  2. Github:https://github.com/datamonday/BigDataAnalysis




2. 代码实现

导入必要的包,并构造数据。

import numpy as np
from scipy.spatial.distance import pdistx = np.random.random(5)
# array([0.75173729, 0.34763686, 0.71927609, 0.24151473, 0.22294162])y = np.random.random(5)
# array([0.98036113, 0.45482745, 0.87472311, 0.92923963, 0.62922737])

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

# p = 2 ——> 欧氏距离
pdist(xy, metric="minkowski", p=2)

2) 欧氏距离(Euclidean Distance)

# 根据公式求解
np.sqrt(np.sum(np.square(x - y) ) )# 0.8520305805970781
# 根据scipy库求解
xy = np.vstack([x, y])
pdist(xy, metric="euclidean")# array([0.85203058])

3) 曼哈顿距离(Manhattan/City Block Distance)

np.sum(np.abs(x - y))# 1.585272101374208
pdist(xy, metric="cityblock")# array([1.5852721])

4) 切比雪夫距离(Chebyshev Distance)

np.max(np.abs(x - y))# 0.6877248997688814
pdist(xy, metric="chebyshev")# array([0.6877249])

5) 余弦相似度(Cosine Similarity)

np.dot(x, y) / ( np.linalg.norm(x) * np.linalg.norm(y) )# 0.9232011981703329
1 - pdist(xy, metric="cosine")# array([0.9232012])

6) 汉明距离(Hamming Distance)

np.mean( x != y )# 1.0
pdist(xy, metric="hamming")# array([1.])

7) 杰卡德距离(Jaccard Distance)

molecular = np.double( (x != y).sum() )
denominator = np.double(np.bitwise_or( x != 0, y != 0).sum() )molecular / denominator# 1.0
pdist(xy, metric="jaccard")# array([1.])

8) S Φ rensen-Dice

pdist(xy, metric="dice")# array([0.])

9) 半正矢距离(Haversine Distance)

"""
计算Ezeiza机场(阿根廷布宜诺斯艾利斯)和戴高乐机场(法国巴黎)之间的距离。
"""from sklearn.metrics.pairwise import haversine_distances
from math import radiansbsas = [-34.83333, -58.5166646]
paris = [49.0083899664, 2.53844117956]bsas_in_radians = [radians(_) for _ in bsas]
paris_in_radians = [radians(_) for _ in paris]result = haversine_distances([bsas_in_radians, paris_in_radians])
# multiply by Earth radius to get kilometers
result * 6371000/1000

输出:

array([[    0.        , 11099.54035582],[11099.54035582,     0.        ]])

10) 斜交空间距离(Oblique Space Distance)

11) 兰氏距离(Canberra Distance)

np.sum( np.true_divide( np.abs(x - y), np.abs(x) + np.abs(y) ) )# 1.4272762731136441
pdist(xy, metric="canberra")# array([1.42727627])

12) 马氏距离(Mahalanobis Distance)

  • 马氏距离要求样本个数>维数,此处重新生成样本集:10个样本,2个属性;

  • 马氏距离计算两两样本之间的距离,故结果包含:C102=45C^{2}_{10} = 45C102​=45 个距离分量。

data = np.random.random([10, 2])
data # (10, 2)
array([[0.16057991, 0.03173777],[0.04984203, 0.63608966],[0.0965663 , 0.54125706],[0.14562222, 0.50749436],[0.12384608, 0.66895134],[0.38362246, 0.96750912],[0.66204458, 0.34832719],[0.62169272, 0.76812896],[0.55320254, 0.59736334],[0.53135375, 0.97430267]])
# 求解个维度之间协方差矩阵
S = np.cov(data.T)
# 计算协方差矩阵的逆矩阵
ST = np.linalg.inv(S)
ST
array([[18.39262731, -4.22549979],[-4.22549979, 13.68987876]])
n = data.shape[0]
d1 = []for i in range(0, n):for j in range(i + 1, n):delta = data[i] - data[j]d = np.sqrt( np.dot( np.dot(delta, ST), delta.T) )d1.append(d)print(len(d1))
d1
45
[2.4064983868149823,1.9761163000756812,1.778448926503528,2.404430793536302,3.3375019493285927,2.1576814382238196,2.9094250412104405,2.3104822379986585,3.426008151540264,0.4480137866843753,0.7065459737678685,0.30815685501580464,1.618002146140689,3.0847744520164553,2.3696411013587313,2.2012364723722557,2.1104688855720037,0.2717792884385083,0.4554926318973598,1.7230353296945067,2.7042335514201556,2.183968292942155,1.9135693479813816,2.1102154148029593,0.6287347650129346,1.735958615801837,2.438573435905017,2.012440681515558,1.6900976084983395,2.048918972209157,1.3438862451280977,2.862373485815439,2.067854534269353,1.928870122984677,1.8108503250774675,2.851523901145603,1.409891022070067,1.7131869461579778,0.6273442013634126,1.608018006961265,1.1384164544766362,2.5238527095532692,0.6218088758251554,0.94309743685501,1.422491582300723]
pdist(data, metric="mahalanobis")
array([2.40649839, 1.9761163 , 1.77844893, 2.40443079, 3.33750195,2.15768144, 2.90942504, 2.31048224, 3.42600815, 0.44801379,0.70654597, 0.30815686, 1.61800215, 3.08477445, 2.3696411 ,2.20123647, 2.11046889, 0.27177929, 0.45549263, 1.72303533,2.70423355, 2.18396829, 1.91356935, 2.11021541, 0.62873477,1.73595862, 2.43857344, 2.01244068, 1.69009761, 2.04891897,1.34388625, 2.86237349, 2.06785453, 1.92887012, 1.81085033,2.8515239 , 1.40989102, 1.71318695, 0.6273442 , 1.60801801,1.13841645, 2.52385271, 0.62180888, 0.94309744, 1.42249158])

Reference:

  1. 《大数据分析与挖掘》 ch5:聚类算法
  2. 数据科学中常见的9种距离度量方法,内含欧氏距离、切比雪夫距离等
  3. 9 Distance Measures in Data Science

数据挖掘中的12种距离度量原理及实现代码相关推荐

  1. 数据科学中常见的9种距离度量方法

    选自towardsdatascience 作者:Maarten Grootendorst 机器之心编译 编辑:陈萍 在数据挖掘中,我们经常需要计算样本之间的相似度,通常的做法是计算样本之间的距离.在本 ...

  2. 数据科学中常见的9种距离度量方法(包括曼哈顿距离、欧氏距离、半正矢距离等)

    数据科学中常见的9种距离度量方法(包括曼哈顿距离.欧氏距离.半正矢距离等) 1.欧氏距离(Euclidean Distance) 2.余弦相似度(Cosine Similarity) 3.汉明距离(H ...

  3. 【机器学习基础】常见的9种距离度量方法,内含欧氏距离、切比雪夫距离等

    作者|机器之心编译 来源|机器之心 在数据挖掘中,我们经常需要计算样本之间的相似度,通常的做法是计算样本之间的距离.在本文中,数据科学家 Maarten Grootendorst 向我们介绍了 9 种 ...

  4. 弗雷歇距离的原理及python代码实现(动态规划)

    弗雷歇距离的原理及python代码实现(动态规划) 在网上看了很多关于弗雷歇距离的介绍,结合自己的理解,出一版更通俗易懂.更清晰具体的解释. 最简单的解释自然是最短狗绳长度,但我将从另一个角度来解释它 ...

  5. 数据科学中常见的9种距离度量方法,包括欧氏距离、切比雪夫距离、半正矢距离等

    1.欧氏距离(Euclidean Distance) 欧式距离可解释为连接两个点的线段的长度.欧式距离公式非常简单,使用勾股定理从这些点的笛卡尔坐标计算距离. 代码实现: import numpy a ...

  6. @Aspect中@Pointcut 12种用法

    本文主要内容:掌握@Pointcut的12种用法. Aop相关阅读 阅读本文之前,需要先掌握下面3篇文章内容,不然会比较吃力. Spring系列第15篇:代理详解(java动态代理&CGLIB ...

  7. python 聚类_聚类算法中的四种距离及其python实现

    欧氏距离 欧式距离也就是欧几里得距离,是最常见也是最简单的一种距离,再n维空间下的公式为: 在python中,可以运用scipy.spatial.distance中的pdist方法来实现,但需要调整其 ...

  8. 呕心整理Java中的12种常用设计模式以及应用场景

    目录 单例模式 饿汉模式 懒汉模式 线程锁模式 双重判断模式 静态内部类模式 策略模式 工厂模式 简单工厂 抽象工厂 门面模式 装饰器模式 责任链模式 享元模式 观察者模式 代理模式 静态代理模式 动 ...

  9. 机器学习领域 几种距离度量方法【3】

    十三.堪培拉距离 (Canberra Distance) 十四.布雷柯蒂斯距离(Bray Curtis Distance) 十五.交叉熵(Cross Entropy) 十六.相对熵(relative ...

最新文章

  1. POJ 2853 Sequence Sum Possibilities
  2. Android攻城狮Gallery和ImageSwitcher制作图片浏览器
  3. 外媒评出中国最美20个景点
  4. Mac下Idea安装Git报错Xcrun问题的解决
  5. zookeeper的安装集群版
  6. 串口的定义,232,485,UART,TTL之间的区别和关系到底是什么
  7. 在TMS320F28XXX DSP上实现从flash拷贝整个程序到ram运行的方法探讨
  8. (五)js数组方法二
  9. 充电器pps功能是什么_科普:PPS充电器是什么?为何不兼容笔电?
  10. linux系统编程实训总结,linux实训总结与体会
  11. 锋迷商城项目介绍(一)
  12. 吉林大学计算机伦理学,王爱民-吉林大学计算机科学与技术学院
  13. JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解
  14. MIPS反汇编拆炸弹
  15. Kubernetes--k8s--进阶--全面了解HPA--部署HPA实现高可用和成本控制
  16. 室内定位UWB技术在工业场景的潜力几何?
  17. 毕业论文怎么写才能把重复率降到最低?
  18. Web程序设计基础——edu实训平台代码(1)
  19. 什么是BFC?可以解决什么问题?
  20. 论P2P的实现(如何穿透NAT)

热门文章

  1. 企业邮箱怎么购买?企业邮箱能给公司带来什么好处?
  2. 笔记本机械硬盘性能深入研究
  3. php 下载png图片功能实现
  4. 微信支付后默认关注公众号与推荐关注公众号规则
  5. 常见操作String的方法(字符查找,索引查找)
  6. easyuefi安装不了_手把手教你Windows Linux双系统的安装与卸载
  7. 红帽认证工程师及红帽认证技师应试指南
  8. 奋斗吧,程序员——第十八章 山盟虽在,锦书难托
  9. java程序造成ora-7445_Problem Key 'ORA 7445 [pevm_icd_call_common]'
  10. 计蒜客第六场 微软大楼设计方案(困难)