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 测试实现方法
Dec 24 Python
Python读取图片属性信息的实现方法
Sep 11 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
Python中元组,列表,字典的区别
May 21 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
Apr 17 Python
Python 数据分析之逐块读取文本的实现
Dec 14 Python
python 基于opencv操作摄像头
Dec 24 Python
python Timer 类使用介绍
Dec 28 Python
python 如何在测试中使用 Mock
Mar 01 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 中检查或过滤IP地址的实现代码
2011/11/27 PHP
yii操作cookie实例简介
2014/07/09 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
NumPy统计函数的实现方法
2020/01/21 Python
Python对象的属性访问过程详解
2020/03/05 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
大专自我鉴定范文
2013/10/23 职场文书
班级聚会策划书
2014/01/16 职场文书
网络编辑岗位职责
2014/03/18 职场文书
求职个人评价范文
2014/04/09 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
高中军训感想
2015/08/07 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
python tkinter模块的简单使用
2021/04/07 Python