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中的yield函数的用法
Apr 03 Python
python单例模式实例分析
Apr 08 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
python如何在循环引用中管理内存
Mar 20 Python
python爬取各类文档方法归类汇总
Mar 22 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
python如何变换环境
Jul 21 Python
python中用ctypes模拟点击的实例讲解
Nov 26 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实现MySQL更新记录的代码
2008/06/07 PHP
PHP 开发环境配置(Zend Studio)
2010/04/28 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
jQuery MD5加密实现代码
2010/03/15 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
浅析vue深复制
2018/01/29 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
python根据文件大小打log日志
2014/10/09 Python
python re模块的高级用法详解
2018/06/06 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
保证书范文大全
2014/04/28 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
2014年资料员工作总结
2014/11/18 职场文书
2016春节慰问信范文
2015/03/25 职场文书
工作会议简报
2015/07/20 职场文书
HTML基础详解(下)
2021/10/16 HTML / CSS