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实现类似ftp传输文件的网络程序示例
Apr 08 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
django中send_mail功能实现详解
Feb 06 Python
一份python入门应该看的学习资料
Apr 11 Python
python批量查询、汉字去重处理CSV文件
May 31 Python
python实现屏保计时器的示例代码
Aug 08 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
Python 判断时间是否在时间区间内的实例
May 16 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 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 多线程上下文中安全写文件实现代码
2009/12/28 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
angularjs基础教程
2014/12/25 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
Python中一行和多行import模块问题
2018/04/01 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
python中温度单位转换的实例方法
2020/12/27 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
行政主管职责范本
2014/03/07 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
贷款担保书范本
2015/09/22 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL