常用距离算法 (原理、使用场景、Python实现代码)
距离度量是有监督和无监督学习算法的基础,包括k近邻、支持向量机和k均值聚类等。
距离度量的选择影响我们的机器学习结果,因此考虑哪种度量最适合这个问题是很重要的。因此,我们在决定使用哪种测量方法时应该谨慎。但在做出决定之前,我们需要了解距离测量是如何工作的,以及我们可以从哪些测量中进行选择。
本文将简要介绍常用的距离度量方法、它们的工作原理、如何用Python计算它们以及何时使用它们。这样可以加深知识和理解,提高机器学习算法和结果。
在更深入地研究不同的距离测量之前,我们先要有一个关于它们如何工作以及如何选择合适的测量的大致概念。
距离度量用于计算给定问题空间中两个对象之间的差异,即数据集中的特征。然后可以使用该距离来确定特征之间的相似性, 距离越小特征越相似。
对于距离的度量,我们可以在几何距离测量和统计距离测量之间进行选择,应该选择哪种距离度量取决于数据的类型。特征可能有不同的数据类型(例如,真实值、布尔值、分类值),数据可能是多维的或由地理空间数据组成。
几何距离测量
1、欧氏距离 Euclidean distance
欧氏距离度量两个实值向量之间的最短距离。由于其直观,使用简单和对许多用例有良好结果,所以它是最常用的距离度量和许多应用程序的默认距离度量。
欧氏距离也可称为l2范数,其计算方法为:
Python代码如下
from scipy.spatial import distance
distance.euclidean(vector_1, vector_2)
欧氏距离有两个主要缺点。首先,距离测量不适用于比2D或3D空间更高维度的数据。第二,如果我们不将特征规范化和/或标准化,距离可能会因为单位的不同而倾斜。
2、曼哈顿距离 Manhattan distance
曼哈顿距离也被称为出租车或城市街区距离,因为两个实值向量之间的距离是根据一个人只能以直角移动计算的。这种距离度量通常用于离散和二元属性,这样可以获得真实的路径。
曼哈顿距离以l1范数为基础,计算公式为:
Python代码如下
from scipy.spatial import distance
distance.cityblock(vector_1, vector_2)
曼哈顿的距离有两个主要的缺点。它不如高维空间中的欧氏距离直观,它也没有显示可能的最短路径。虽然这可能没有问题,但我们应该意识到这并不是最短的距离。
3、切比雪夫距离 Chebyshev distance
切比雪夫距离也称为棋盘距离,因为它是两个实值向量之间任意维度上的最大距离。它通常用于仓库物流中,其中最长的路径决定了从一个点到另一个点所需的时间。
切比雪夫距离由l -无穷范数计算:
Python代码如下
from scipy.spatial import distance
distance.chebyshev(vector_1, vector_2)
切比雪夫距离只有非常特定的用例,因此很少使用。
4、闵可夫斯基距离 Minkowski distance
闵可夫斯基距离是上述距离度量的广义形式。它可以用于相同的用例,同时提供高灵活性。我们可以选择 p 值来找到最合适的距离度量。
闵可夫斯基距离的计算方法为:
Python代码如下
from scipy.spatial import distance
distance.minkowski(vector_1, vector_2, p)
由于闵可夫斯基距离表示不同的距离度量,它就有与它们相同的主要缺点,例如在高维空间的问题和对特征单位的依赖。此外,p值的灵活性也可能是一个缺点,因为它可能降低计算效率,因为找到正确的p值需要进行多次计算。
5、余弦相似度和距离 Cosine similarity
余弦相似度是方向的度量,他的大小由两个向量之间的余弦决定,并且忽略了向量的大小。余弦相似度通常用于与数据大小无关紧要的高维,例如,推荐系统或文本分析。
余弦相似度可以介于-1(相反方向)和1(相同方向)之间,计算方法为:
余弦相似度常用于范围在0到1之间的正空间中。余弦距离就是用1减去余弦相似度,位于0(相似值)和1(不同值)之间。
Python代码如下
from scipy.spatial import distancedistance.cosine(vector_1, vector_2)
余弦距离的主要缺点是它不考虑大小而只考虑向量的方向。因此,没有充分考虑到值的差异。
6、半正矢距离 Haversine distance
半正矢距离测量的是球面上两点之间的最短距离。因此常用于导航,其中经度和纬度和曲率对计算都有影响。
半正矢距离的公式如下:
其中r为球面半径,φ和λ为经度和纬度。
Python代码如下
from sklearn.metrics.pairwise import haversine_distances
haversine_distances([vector_1, vector_2])
半正矢距离的主要缺点是假设是一个球体,而这种情况很少出现。
7、汉明距离
汉明距离衡量两个二进制向量或字符串之间的差异。
对向量按元素进行比较,并对差异的数量进行平均。如果两个向量相同,得到的距离是0之间,如果两个向量完全不同,得到的距离是1。
Python代码如下
from scipy.spatial import distance
distance.hamming(vector_1, vector_2)
汉明距离有两个主要缺点。距离测量只能比较相同长度的向量,它不能给出差异的大小。所以当差异的大小很重要时,不建议使用汉明距离。
统计距离测量
统计距离测量可用于假设检验、拟合优度检验、分类任务或异常值检测。
8、杰卡德指数和距离 Jaccard Index
Jaccard指数用于确定两个样本集之间的相似性。它反映了与整个数据集相比存在多少一对一匹配。Jaccard指数通常用于二进制数据比如图像识别的深度学习模型的预测与标记数据进行比较,或者根据单词的重叠来比较文档中的文本模式。
Jaccard距离的计算方法为:
Python代码如下
from scipy.spatial import distance
distance.jaccard(vector_1, vector_2)
Jaccard指数和距离的主要缺点是,它受到数据规模的强烈影响,即每个项目的权重与数据集的规模成反比。
9、Sorensen-Dice指数
Sörensen-Dice指数类似于Jaccard指数,它可以衡量的是样本集的相似性和多样性。该指数更直观,因为它计算重叠的百分比。Sörensen-Dice索引常用于图像分割和文本相似度分析。
计算公式如下:
Python代码如下
from scipy.spatial import distance
distance.dice(vector_1, vector_2)
它的主要缺点也是受数据集大小的影响很大。
10、动态时间规整 Dynamic Time Warping
动态时间规整是测量两个不同长度时间序列之间距离的一种重要方法。可以用于所有时间序列数据的用例,如语音识别或异常检测。
为什么我们需要一个为时间序列进行距离测量的度量呢?如果时间序列长度不同或失真,则上述面说到的其他距离测量无法确定良好的相似性。比如欧几里得距离计算每个时间步长的两个时间序列之间的距离。但是如果两个时间序列的形状相同但在时间上发生了偏移,那么尽管时间序列非常相似,但欧几里得距离会表现出很大的差异。
动态时间规整通过使用多对一或一对多映射来最小化两个时间序列之间的总距离来避免这个问题。当搜索最佳对齐时,这会产生更直观的相似性度量。通过动态规划找到一条弯曲的路径最小化距离,该路径必须满足以下条件:
边界条件:弯曲路径在两个时间序列的起始点和结束点开始和结束
单调性条件:保持点的时间顺序,避免时间倒流
连续条件:路径转换限制在相邻的时间点上,避免时间跳跃
整经窗口条件(可选):允许的点落入给定宽度的整经窗口
坡度条件(可选):限制弯曲路径坡度,避免极端运动
我们可以使用 Python 中的 fastdtw 包:
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
distance, path = fastdtw(timeseries_1, timeseries_2, dist=euclidean)
动态时间规整的一个主要缺点是与其他距离测量方法相比,它的计算工作量相对较高。
总结
在这篇文章中,简要介绍了十种常用的距离测量方法。本文中已经展示了它们是如何工作的,如何在Python中实现它们,以及经常使用它们解决什么问题。
如果你认为我错过了一个重要的距离测量,请留言告诉我。
常用距离算法 (原理、使用场景、Python实现代码)相关推荐
- 【算法思想】Reed-Solomon 纠错编码基础概念,编码、解码算法原理、数学公式 Python代码实现
[算法思想]Reed-Solomon 纠错编码基础概念,编码.解码算法原理.数学公式 & Python代码实现 文章目录 [算法思想]Reed-Solomon 纠错编码基础概念,编码.解码算法 ...
- 详解鲸鱼优化算法原理、数学模型和实例代码
鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提出的一种新的群体智能优化算法,其优点在于操作简单,调整 ...
- 利用计算机语言实现ID3算法,机器学习之决策树学习-id3算法-原理分析及c语言代码实现.pdf...
机器学习之决策树学习-id3算法-原理分析及c语言代码实现.pdf 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保 ...
- 常用机器学习算法原理及推导
周末花半天多的时间整理了一下常用机器学习算法的原理及推导,分享出来给大家. 线性回归和逻辑回归 支持向量机(这个貌似工作中不怎么用,就用了之前的笔记) 决策树和随机森林 GBDT Xgboost和Li ...
- L-BFGS算法/Broyden族/BFGS算法/阻尼牛顿法的Python实现代码
下面定义了三个Python语言编写的函数:函数表达式fun,梯度向量gfun,和海森矩阵hess.这三个表达式在后面各个算法的实现中会用到. # 函数表达式fun fun = lambda x:100 ...
- word2vec模型原理(附python实现代码)
附python实现代码 模型训练 import logging import gensim from gensim.models import word2vec # 设置输出日志 logging.ba ...
- 基于Python实现五大常用分类算法(原理+代码)
读: 在机器学习和统计中,分类算法通过对已知类别训练集的计算和分析,从中发现类别规则并预测新数据的类别.分类被认为是监督学习的一个实例,即学习可以获得正确识别的观察的训练集的情况. 实现分类的算法,特 ...
- GIS开发中常用几何算法原理图解
转自:OSGeo中国中心 http://www.osgeo.cn/post/ae457 计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简 ...
- 梯度下降算法和牛顿算法原理以及使用python用梯度下降和最小二乘算法求回归系数
梯度下降算法 以下内容参考 微信公众号 AI学习与实践平台 SIGAI 导度和梯度的问题 因为我们做的是多元函数的极值求解问题,所以我们直接讨论多元函数.多元函数的梯度定义为: 其中称为梯度算子,它作 ...
最新文章
- 基于Java的Selenium学习笔记——Assert
- 一个引发程序员们干架的问题
- 数组方法 包含es6
- 从源代码解释Android事件分发机制
- matlab模拟砂轮形貌,基于多颗磨粒随机分布的虚拟砂轮建模及磨削力预测
- ppt修复无法读取_CVE20201938 Tomcat 文件读取/包含漏洞复现
- [SDOI 2011]黑白棋
- 《天下强汉》3、强汉骄子,双星闪耀——卫青霍去病的华美人生
- 5个值得收藏的视频下载网站
- A3文件转换成A4文件
- 牛刀:中国未来房价基本走势…
- 扁豆凝集素LCA/LcH填料/小扁豆凝集素-琼脂糖凝胶/双花扁豆凝集素DBA/黑皮扁豆凝集素
- c语言程序烧写步骤,单片机烧写程序步骤
- 如何在PB数据窗口中设置数据窗口的更新属性
- win7无法打开计算机共享文件夹,Win7共享文件夹无法访问怎么办?Win7共享文件夹无法访问解决方法...
- interpro 数据库
- 队列的应用--火车车厢重排列
- Java操作word文档将docx转换为pdf格式
- 【UI】产品设计之什么是色彩情绪
- java中got是什么意思_Java基本概念的了解
热门文章
- java程序员比c多_为什么JAVA会比C语言使用的多?
- windows xp 服务详解
- win10 无限闪屏闪桌面
- mysql计算员工一年工资_一年平均工资怎么算
- [转]思科与华为之战:数据通信市场面临裂变
- linux minimal bash,制作CentOS8安装U盘时遇到的“Minimal BASH-like…”问题
- 2023最新Java核心技术面试助你跳槽,涨薪50w!
- android8.1美化,QQ主题美化助手
- 达梦8数据库的优势及特点
- 用java写一个简易日历