Python Numpy计算各类距离的方法


Posted in Python onJuly 05, 2019

详细:

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

2.欧氏距离(Euclidean Distance)

3.曼哈顿距离(Manhattan Distance)

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

5.夹角余弦(Cosine)

6.汉明距离(Hamming distance)

7.杰卡德相似系数(Jaccard similarity coefficient)

8.贝叶斯公式

1.闵氏距离的定义:

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

Python Numpy计算各类距离的方法

其中p是一个变参数。

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

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

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

np.linalg.norm #是适合使用这个公式

2.欧氏距离(Euclidean Distance)

欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式(如图1.9)。

Python Numpy计算各类距离的方法

python实现欧式距离公式的:

vector1 = np.array([1,2,3])
vector2 = np.array([4,5,6])
 
op1=np.sqrt(np.sum(np.square(vector1-vector2)))
op2=np.linalg.norm(vector1-vector2)
print(op1)
print(op2)
#输出:
#5.19615242271
#5.19615242271

3.曼哈顿距离(Manhattan Distance)

从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”(L1范数)。而这也是曼哈顿距离名称的来源,曼哈顿距离也称为城市街区距离(City Block distance)(如图1.10)。

Python Numpy计算各类距离的方法

python实现曼哈顿距离:

vector1 = np.array([1,2,3])
vector2 = np.array([4,5,6])
 
op3=np.sum(np.abs(vector1-vector2))
op4=np.linalg.norm(vector1-vector2,ord=1)
#输出
#9
#9.0

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

国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个(如图1.11)。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max(| x2-x1| , |y2-y1| ) 步。有一种类似的一种距离度量方法叫切比雪夫距离(L∞范数)。

Python Numpy计算各类距离的方法

 Python实现切比雪夫距离:

vector1 = np.array([1,2,3])
vector2 = np.array([4,7,5])
op5=np.abs(vector1-vector2).max()
op6=np.linalg.norm(vector1-vector2,ord=np.inf)
print(op5)
print(op6)
#输出:
#5
#5.0

5. 夹角余弦(Cosine)

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

Python Numpy计算各类距离的方法

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

Python Numpy计算各类距离的方法

(2) 两个n维样本点A (x11,x12,…,x1n)与 B(x21,x22,…,x2n)的夹角余弦
类似的,对于两个n维样本点A(x11,x12,…,x1n)与 B(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

Python Numpy计算各类距离的方法

夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

python实现夹角余弦

vector1 = np.array([1,2,3])
vector2 = np.array([4,7,5])
 
op7=np.dot(vector1,vector2)/(np.linalg.norm(vector1)*(np.linalg.norm(vector2)))
print(op7)
#输出
#0.929669680201

6. 汉明距离(Hamming distance)

(1)汉明距离的定义

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

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

(2) python实现汉明距离:

v1=np.array([1,1,0,1,0,1,0,0,1])
v2=np.array([0,1,1,0,0,0,1,1,1])
smstr=np.nonzero(v1-v2)
print(smstr) # 不为0 的元素的下标
sm= np.shape(smstr[0])[0] 
print( sm )
#输出
#(array([0, 2, 3, 5, 6, 7]),)
#6

7. 杰卡德相似系数(Jaccard similarity coefficient)

(1) 杰卡德相似系数

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

Python Numpy计算各类距离的方法

(2) 杰卡德距离

与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:

Python Numpy计算各类距离的方法

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

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

那么样本A与B的杰卡德相似系数可以表示为:

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

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

Python Numpy计算各类距离的方法

 Python实现杰卡德距离:

import scipy.spatial.distance as dist
 
v1=np.array([1,1,0,1,0,1,0,0,1])
v2=np.array([0,1,1,0,0,0,1,1,1])
 
matv=np.array([v1,v2])
print(matv)
ds=dist.pdist(matv,'jaccard')
print(ds)
 
#输出
#[[1 1 0 1 0 1 0 0 1] [0 1 1 0 0 0 1 1 1]]
 
# [ 0.75]

8. 经典贝叶斯公式

原: P(AB)=P(A | B)·P(B)=P(B | A)·P(A)

Python Numpy计算各类距离的方法

本例,我们不去研究黄色的苹果与黄色的梨有什么差别。而承认其统计规律:苹果是红色的概率是0.8,苹果是黄色的概率就是1-0.8=0.2,而梨是黄色的概率是0.9,将其作为先验概率。有了这个先验概率,就可以利用抽样,即任取一个水果,前提是抽样对总体的概率分布没有影响,通过它的某个特征来划分其所属的类别。黄色是苹果和梨共有的特征,因此,既有可能是苹果也有可能是梨,概率计算的意义在于得到这个水果更有可能的那一种。

条件: 10个苹果10个梨子

用数学的语言来表达,就是已知:

# P(苹果)=10/(10+10),P(梨)=10/(10+10),P(黄色|苹果)=20%,P(黄色|梨)=90%,P(黄色)= 20% * 0.5 + 90% * 0.5 = 55%

求P(梨|黄色):

# = P(黄色|梨)P(梨)/P(黄色)
 
# = 81.8%

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
轻松实现python搭建微信公众平台
Feb 16 Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
Python常见的pandas用法demo示例
Mar 16 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 Python
如何提高python 中for循环的效率
Apr 15 Python
详解Python 最短匹配模式
Jul 29 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
Python几种酷炫的进度条的方式
Apr 11 Python
ERLANG和PYTHON互通实现过程详解
Jul 05 #Python
python如何读取bin文件并下发串口
Jul 05 #Python
anaconda如何查看并管理python环境
Jul 05 #Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 #Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 #Python
python调用并链接MATLAB脚本详解
Jul 05 #Python
python实现最大子序和(分治+动态规划)
Jul 05 #Python
You might like
PHP中文件上传的一个问题
2010/09/04 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
详解js类型判断
2018/05/22 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
js实现聊天对话框
2020/02/08 Javascript
Python验证文件是否可读写代码分享
2017/12/11 Python
高效使用Python字典的清单
2018/04/04 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
python多线程同步实例教程
2019/08/11 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
Python语言异常处理测试过程解析
2020/01/08 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
详解Django中异步任务之django-celery
2020/11/05 Python
adidas美国官网:adidas US
2016/09/21 全球购物
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
linux面试相关问题
2013/04/28 面试题
办公室副主任岗位职责
2013/11/25 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
投标承诺函范文
2015/01/21 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python