马氏距离和欧式距离详解

article/2025/9/14 8:15:09

一般在机器学习模型中会涉及到衡量两个样本间的距离,如聚类、KNN,K-means等,使用的距离为欧式距离。其实,除了欧氏距离之外,还有很多的距离计算标准,本文主要介绍欧氏距离和马氏距离。

欧氏距离

最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点 x = ( x 1 , … , x n ) x = (x_1,…,x_n) x=(x1,,xn) y = ( y 1 , … , y n ) y = (y_1,…,y_n) y=(y1,,yn) 之间的距离为:
d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + . . . + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 d(x,y) = \sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2} = \sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} d(x,y)=(x1y1)2+(x2y2)2+...+(xnyn)2 =i=1n(xiyi)2

  1. 二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:
    d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d12=(x1x2)2+(y1y2)2

  2. 两个n维向量 a ( x 11 , x 12 , … , x 1 n ) a(x_{11},x_{12},…,x_{1n}) a(x11,x12,,x1n) b ( x 21 , x 22 , … , x 2 n ) b(x_{21},x_{22},…,x_{2n}) b(x21,x22,,x2n)间的欧氏距离:
    d 12 = ∑ k = 1 n ( x 1 k − x 2 k ) 2 d_{12} = \sqrt{\sum_{k=1}^{n}(x_{1k}-x_{2k})^2} d12=k=1n(x1kx2k)2

马氏距离

在介绍马氏距离之前,我们先来看如下几个概念:

  1. 方差:方差是标准差的平方,而标准差的意义是数据集中各个点到均值点距离的平均值。反应的是数据的离散程度。

  2. 协方差: 标准差与方差是描述一维数据的,当存在多维数据时,我们通常需要知道每个维数的变量中间是否存在关联。协方差就是衡量多维数据集中,变量之间相关性的统计量。比如说,一个人的身高与他的体重的关系,这就需要用协方差来衡量。如果两个变量之间的协方差为正值,则这两个变量之间存在正相关,若为负值,则为负相关。

  3. 协方差矩阵: 当变量多了,超过两个变量了。那么,就用协方差矩阵来衡量这么多变量之间的相关性。假设 X X X 是以 n n n个随机变数(其中的每个随机变数是也是一个向量,当然是一个行向量)组成的列向量:
    X = [ X 1 X 2 ⋮ X n ] X = \begin{bmatrix} X_1 \\ X_2 \\ \vdots \\ X_n \end{bmatrix} X=X1X2Xn
    其中, μ i μ_i μi是第i个元素的期望值,即 μ i = E ( X i ) μ_i=E(X_i) μi=E(Xi)。协方差矩阵的第 i , j i,j i,j项(第 i , j i,j i,j项是一个协方差)被定义为如下形式:
    ∑ i j = c o v ( X i , X j = E [ ( X i − μ i ) ( X j − μ j ) ] ) \sum_{ij} = cov(X_i,X_j = E[(X_i-\mu_i)(X_j-\mu_j)]) ij=cov(Xi,Xj=E[(Xiμi)(Xjμj)])
    即:
    ∑ = [ E [ ( X 1 − μ 1 ) ( X 1 − μ 1 ) ] ) E [ ( X 1 − μ 1 ) ( X 2 − μ 2 ) ] ) ⋯ E [ ( X 1 − μ 1 ) ( X n − μ n ) ] ) E [ ( X 2 − μ 2 ) ( X 1 − μ 1 ) ] ) E [ ( X 2 − μ 2 ) ( X 2 − μ 2 ) ] ) ⋯ E [ ( X 2 − μ 2 ) ( X n − μ n ) ] ) ⋮ ⋮ ⋱ ⋮ E [ ( X n − μ n ) ( X 1 − μ 1 ) ] ) E [ ( X n − μ n ) ( X 2 − μ 2 ) ] ) ⋯ E [ ( X n − μ n ) ( X n − μ n ) ] ) ] \sum = \begin{bmatrix} E[(X_1-\mu_1)(X_1-\mu_1)]) & E[(X_1-\mu_1)(X_2-\mu_2)]) & \cdots & E[(X_1-\mu_1)(X_n-\mu_n)]) \\ E[(X_2-\mu_2)(X_1-\mu_1)]) & E[(X_2-\mu_2)(X_2-\mu_2)]) & \cdots & E[(X_2-\mu_2)(X_n-\mu_n)]) \\ \vdots & \vdots & \ddots & \vdots \\ E[(X_n-\mu_n)(X_1-\mu_1)]) & E[(X_n-\mu_n)(X_2-\mu_2)]) & \cdots & E[(X_n-\mu_n)(X_n-\mu_n)]) \end{bmatrix} =E[(X1μ1)(X1μ1)])E[(X2μ2)(X1μ1)])E[(Xnμn)(X1μ1)])E[(X1μ1)(X2μ2)])E[(X2μ2)(X2μ2)])E[(Xnμn)(X2μ2)])E[(X1μ1)(Xnμn)])E[(X2μ2)(Xnμn)])E[(Xnμn)(Xnμn)])
    矩阵中的第 ( i , j ) (i,j) (i,j) 个元素是 X i X_i Xi X j X_j Xj 的协方差。

马氏距离的定义:
马氏距离(Mahalanobis Distance)是由马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。
对于一个均值为 μ = ( μ 1 , μ 2 , μ 3 , . . . , μ p ) T μ=(μ_1,μ_2,μ_3,...,μ_p)^T μ=(μ1,μ2,μ3,...,μp)T,协方差矩阵为 S S S的多变量 x = ( x 1 , x 2 , x 3 , . . . , x p ) T x=(x_1,x_2,x_3,...,x_p)^T x=(x1,x2,x3,...,xp)T,其马氏距离为:
D M ( x ) = ( x − μ ) T S − 1 ( x − μ ) D_M(x) = \sqrt{(x-\mu)^T {S}^{-1}(x-\mu)} DM(x)=(xμ)TS1(xμ)
我们可以发现如果 S − 1 S^{-1} S1是单位阵的时候,马氏距离简化为欧氏距离

那我们为什么要用马氏距离呢?
马氏距离有很多优点: 马氏距离不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰

下面我们来看一个例子:
如果我们以厘米为单位来测量人的身高,以克(g)为单位测量人的体重。每个人被表示为一个两维向量,如一个人身高173cm,体重50000g,表示为(173,50000),根据身高体重的信息来判断体型的相似程度。

我们已知小明(160,60000);小王(160,59000);小李(170,60000)。根据常识可以知道小明和小王体型相似。但是如果根据欧几里得距离来判断,小明和小王的距离要远远大于小明和小李之间的距离,即小明和小李体型相似。这是因为不同特征的度量标准之间存在差异而导致判断出错

以克(g)为单位测量人的体重,数据分布比较分散,即方差大,而以厘米为单位来测量人的身高,数据分布就相对集中,方差小。马氏距离的目的就是把方差归一化,使得特征之间的关系更加符合实际情况

下图(a)展示了三个数据集的初始分布,看起来竖直方向上的那两个集合比较接近。在我们根据数据的协方差归一化空间之后,如图(b),实际上水平方向上的两个集合比较接近。

在这里插入图片描述

深入分析:
当求距离的时候,由于随机向量的每个分量之间量级不一样,比如说x1可能取值范围只有零点几,而x2有可能时而是2000,时而是3000,因此两个变量的离散度具有很大差异
马氏距离除以了一个方差矩阵,这就把各个分量之间的方差都除掉了,消除了量纲性,更加科学合理。

在这里插入图片描述
如上图,看左下方的图,比较中间那个绿色的和另外一个绿色的距离,以及中间绿色到蓝色的距离

如果不考虑数据的分布,就是直接计算欧式距离,那就是蓝色距离更近

但实际上需要考虑各分量的分布的,呈椭圆形分布

蓝色的在椭圆外,绿色的在椭圆内,因此绿色的实际上更近

马氏距离除以了协方差矩阵,实际上就是把右上角的图变成了右下角

参考资料:
马氏距离通俗理解


http://chatgpt.dhexx.cn/article/SQCUqYlj.shtml

相关文章

PCL 的欧式距离聚类

PCL 的欧式距离聚类 (感谢前辈) 转自:https://zhuanlan.zhihu.com/p/75117664 聚类代码如下: from paper_1_v0.my_ransac import my_ransac_v5 import numpy as npimg_id 1 # 这里读入你的kitti 雷达数据即可 path rD:\KITT…

相似度计算(3)——欧式距离和闵克夫斯基距离

欧式距离和闵克夫斯基距离 一、欧式距离 1、定义 欧式距离(欧几里得距离,欧几里得度量),是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离…

机器学习:欧氏距离(Euclidean Distance)

相关文章链接:算法文章汇总 欧式距离也称欧几里得距离,是最常见的距离度量,衡量的是多维空间中两个点之间的 绝对距离 。 以古希腊数学家欧几里得命名的距离,也就是我们直观的两点之间直线最短的直线距离。 欧氏距离定义&#…

距离度量 —— 欧式距离(Euclidean Distance)

Python学习系列文章:👉 目录 👈 文章目录 一、概述二、计算公式① 二维平面上的欧式距离② 三维空间上的欧式距离③ n维空间上的欧式距离 一、概述 欧式距离,也称为 欧几里得距离,是我们从小学、初中、高中等等乃至现…

[机器学习-概念] 什么是欧式距离、标准化欧式距离、马氏距离、余弦距离

1.欧式距离(Euclidean Distance) 欧式距离源自N维欧氏空间中两点 x 1 , x 2 x_1,x_2 x1​,x2​间的距离公式: 2.标准化欧式距离(Standardized Euclidean distance) 引入标准化欧式距离的原因是一个数据 x i x_i xi​ 的各个维度之间的尺…

PHPStorm使用PHP7新特性出现红色波浪错误

今天在项目中使用PHP7新特性时PHPStorm出现了如下红色错误,看着让人很不舒服,明明没有错 本地配置LNMP的PHP版本是7.2所以不是安装的PHP版本过低的问题,而是PHPStorm默认支持的PHP版本语法问题,通过在偏好设置中查看发现默认是PHP…

PHP8.X的新特性

PHP8.X的新特性 随着2020年的PHP开发者峰会结束,8.X将在11月26发布 一、JIT JIT的新特性,则是将PHP代码转化为传统的机器码,而并非通过zend虚拟机来运行,这大大增加了运行速度。但是缺点是向下不兼容。 # JIT 可以通过php.ini中…

PHP 7.4 新特性

PHP 7.4 计划在2019年11月21日发布,它主要新增了以下几个特性: 短闭包函数 短闭包函数可以减少冗余代码: array_map(function (User $user) { return $user->id; }, $users) array_map(fn(User $user) > $user->id, $users) 需要…

PHP7.0至PHP8部分特性总结

PHP7.0特性 2015年6月11日,PHP开发团队宣布将立即提供PHP 7.0.0 Alpha1。此版本标志着PHP 7主要系列的开始。我们有许多原因,应该对PHP7.0感到兴奋,接下来让我们来看一下它全新的语言特性! 性能: PHP7.0采用下一代由PHP核心团队开…

php8新特性全览【超详细】

题外话: PHP 8.0 是 PHP 语言的重大更新。 它包含许多新功能和优化,包括命名参数、联合类型、属性、构造函数属性提升、匹配表达式、空安全运算符、JIT,以及类型系统、错误处理和一致性方面的改进。 废话不多说,开车 1.便利的命名…

php 7新特性(一):类型的限定

1、标量类型声明: a.默认:以前的弱类型 b.严格:declare(strict_types1) //strict_types的值(1或者0),1表示严格类型, 0表示弱类型 可以使用的类型参数有:int float bool string inte…

PHP8所有新特性

PHP 8 正式版即将发布,是时候来看看 PHP 8 即将推出的新特性了 首先来安装PHP8 下载地址 https://www.php.net/downloads 本地编译安装 PHP 8 RC2 版本(MAC操作系统) # 0、下载解压源码 wget https://downloads.php.net/~pollita/php-8.0.0RC2.tar.gz tar zxvf p…

PHP8新特性解读

本文主要内容为解读PHP8.0的主要新特性 解读PHP8特性 前言一、给小皮面板下载PHP8二、部分下载PHP8会出现502解决方案三、介绍特性1. 联合类型2. 匹配表达式3. null安全运算符4. 构造函数属性提升5. 注解6. 命名参数 四、总结 前言 PHP8在2020年11月26日正式发布,又…

PHP 7 新特性

转载自: https://zhuanlan.zhihu.com/p/27694633 https://zhuanlan.zhihu.com/p/27847880 https://zhuanlan.zhihu.com/p/29478077 https://goghcrow.gitbooks.io/php7/content/xin-te-xing.html PHP 7 之前的类型提示 PHP 5.0 首次提出函数参数&#xff08…

php7 新特性整理

PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来越好。 在这里整理 PHP 5.1 ,PHP5.2,PHP5.3,PHP5.4,PHP5.5,PHP5.6 ,PHP7,PHP7.1 所有新特性&#xff0…

PHP 7 新特性 - 收集

前言 最好的语言发布了新的版本,一个划时代的大版本:PHP7。 PHP7修复了大量BUG,新增了功能和语法糖。这些改动涉及到了核心包、GD库、PDO、ZIP、ZLIB等熟悉和不熟悉的核心功能与扩展包。 PHP7移除了已经被废弃的函数,如mysql_系…

PHP7新特性总结

前言 本文是一篇讲座听后+后续研究的总结。 话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,也是立马写了个超级耗时间的循环脚本测了一番,确实php7给力很多,然后也是注意了一些新增的特性与一…

搭建图片加密平台,扫码支付后简单获取密码

搭建图片加密平台,扫码支付后简单获取密码 很多人问我,互联网上到底做什么项目是可以赚到钱的?没有基础,不懂技术,不会推广,所以有没有简单一点的,一操作就能上手就能赚钱的?我可以…

java中Base64图片加密解密保存

工具类中的图片解密的代码 /*** base64字符串转图片* param imgStr 图片的base64* param path 将要生成的地址* return*/ public static String generateImage(String imgStr, String path) {//如果图像数据为空 if (imgStr null) {return null;}BASE64Decoder decoder new…

PC微信机器人之实战分析微信图片加密解密

今天主要讨论下微信图片的加密和解密,我们都知道微信接收的图片是加密形式的需要解密,但是这个加密大家都知道是异或。但是怎么异或,跟谁异或呢?这次就是围绕这个来讲的,我们手动计算异或的值,才能彻底明白…