MATLAB求马氏距离(Mahalanobis distance)

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

1.马氏距离计算公式

d2(xi, xj)=(xi-xj)TS-1(xi-xj)

其中,S是总体的协方差矩阵,而不是样本的协方差矩阵。

2.matlab中现有的函数

>> x=[155 66;180 71;190 73;160 60;190 68;150 58;170 75]

x =

   155    66
180 71
190 73
160 60
190 68
150 58
170 75 >> Y = pdist(x,'mahal') Y = Columns 1 through 5 1.572816369474562 2.201942917264386 1.635800793960578 2.695107559788053 1.478413355546874 Columns 6 through 10 1.404831102709996 0.629126547789825 1.713111078598705 1.391260434780810 2.103238561272744 Columns 11 through 15 1.590313263839551 2.103238561272744 1.090736759616727 2.589223001191582 2.033867095735081 Columns 16 through 20 1.825496244926879 0.629126547789825 2.743712945526665 2.441925172889290 2.980237487501595 Column 21 2.793761753017197

其中,X每一行代表一个样例,X是个二维的。Y的第一个数表示x1与x2之间的马氏距离。

3.求x1与x2之间的马氏距离

>> x=[155 66;180 71;190 73;160 60;190 68;150 58;170 75]

x =

   155    66
180 71
190 73
160 60
190 68
150 58
170 75 >> cov=cov(x) cov = 1.0e+02 * 2.702380952380953 0.739285714285714
0.739285714285714 0.412380952380952 >> s=inv(cov) s = 0.007261927639280 -0.013018640484967
-0.013018640484967 0.047588267151168 >> a=[-25 -5]*s*[-25;-5] a = 2.473751332087140 >> sqrt(a) ans = 1.572816369474561

4.注意

计算两两马氏距离时,中间的协方差矩阵永远是总体的,而不是这两个的。所以,马氏距离很容易受总体的影响,总体一变化,两个样例之间的马氏距离就会变化。

以下叙述来自:欧氏距离 vs 马氏距离 - bluenight专栏 - CSDN博客 https://blog.csdn.net/chl033/article/details/5526337

1)马氏距离的计算是建立在总体样本的基础上的,这一点可以从上述协方差矩阵的解释中可以得出,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;
    2)在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离来代替马氏距离,也可以理解为,如果样本数小于样本的维数,这种情况下求其中两个样本的距离,采用欧式距离计算即可。
    3)还有一种情况,满足了条件总体样本数大于样本的维数,但是协方差矩阵的逆矩阵仍然不存在,比如A(3,4),B(5,6);C(7,8),这种情况是因为这三个样本在其所处的二维空间平面内共线(如果是大于二维的话,比较复杂???)。这种情况下,也采用欧式距离计算。
    4)在实际应用中“总体样本数大于样本的维数”这个条件是很容易满足的,而所有样本点出现3)中所描述的情况是很少出现的,所以在绝大多数情况下,马氏距离是可以顺利计算的,但是马氏距离的计算是不稳定的,不稳定的来源是协方差矩阵,这也是马氏距离与欧式距离的最大差异之处。
我们熟悉的欧氏距离虽然很有用,但也有明显的缺点。它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。马氏距离有很多优点。它不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰。它的缺点是夸大了变化微小的变量的作用。

5. MATLAB求两个矩阵之间的马氏距离,使用pdist2()函数

>> x=rand(4,3)

x =

   0.792207329559554   0.849129305868777   0.743132468124916
0.959492426392903 0.933993247757551 0.392227019534168
0.655740699156587 0.678735154857773 0.655477890177557
0.035711678574190 0.757740130578333 0.171186687811562 >> y=rand(2,3) y = 0.706046088019609 0.276922984960890 0.097131781235848
0.031832846377421 0.046171390631154 0.823457828327293 >> z=pdist2(x, y, 'mahal') z = 11.881392154588022 8.912492295829436
10.377530870286948 8.703763775002274
9.513297701500704 6.612259802538707
10.858334218503852 8.268677052674791

其中,数据X是n*d的,数据Y是m*d的,则马氏距离是n*m的矩阵,代表数据X的第i个样例与数据Y的第j个样例之间的马氏距离。

MATLAB求马氏距离(Mahalanobis distance)的更多相关文章

  1. 马氏距离(Mahalanobis distance)

    马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离.它是一种有效的计算两个未知样本集的相似度的方法.与欧 ...

  2. paper 114:Mahalanobis Distance(马氏距离)

    (from:http://en.wikipedia.org/wiki/Mahalanobis_distance) Mahalanobis distance In statistics, Mahalan ...

  3. Mahalanobis Distance(马氏距离)

    (from:http://en.wikipedia.org/wiki/Mahalanobis_distance) Mahalanobis distance In statistics, Mahalan ...

  4. Mahalanobia Distance(马氏距离)的解释

    马氏距离有多重定义: 1)可以表示 某一个样本与DataSet的距离. 2)可以表示两个DataSet之间的距离. 1) The Mahalanobis distance of an observat ...

  5. Mahalanobis距离(马氏距离)的“哲学”解释

    讲解教授:赵辉 (FROM : UESTC) 课程:<模式识别> 整理:PO主 基础知识: 假设空间中两点x,y,定义: 欧几里得距离, Mahalanobis距离, 不难发现,如果去掉马 ...

  6. 基于欧氏距离和马氏距离的异常点检测—matlab实现

    前几天接的一个小项目,基于欧氏距离和马氏距离的异常点检测,已经交接完毕,现在把代码公开. 基于欧式距离的: load data1.txt %导入数据,行为样本,列为特征 X=data1; %赋值给X ...

  7. 有关马氏距离和hinge loss的学习记录

    关于度量学习,之前没有看太多相关的文献.不过南京的周老师的一篇NIPS,确实把这个问题剖析得比较清楚. Mahalanobis距离一般表示为d=(x-y)TM(x-y),其中x和y是空间中两个样本点, ...

  8. Python实现的计算马氏距离算法示例

    Python实现的计算马氏距离算法示例 本文实例讲述了Python实现的计算马氏距离算法.分享给大家供大家参考,具体如下: 我给写成函数调用了 python实现马氏距离源代码:     # encod ...

  9. 相似系数_杰卡德距离(Jaccard Distance)

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

随机推荐

  1. java 8 双冒号运算符

    前言 java8增加了双冒号运算符.lambda本质上都是语法糖,学习过C#委托.匿名委托再理解java8中的双冒号运算符就容易多了.双冒号就是把方法当作参数传递给需要的方法,或者说是传递到strea ...

  2. advanced installer重新打包教程

    一.简介 本次利用Advanced Installer软件里的Repackager重封装工具进行测试制作MSI安装包,还开可以利用Advanced Installerr制作MSI安装包 原理为执行两次 ...

  3. 前端(一)之 HTML

    前端之 HTML 前言 python 基础.网络编程.并发编程与数据库要开始告一段落了,从现在开始进入前端的学习.前端的东西多且杂,需要好好地练习. 什么是前端 前端即网站前台部分,运行在 PC 端, ...

  4. 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收 ...

  5. DataTable和List互转

    /// <summary> /// list转datatable /// </summary> /// <typeparam name="T"> ...

  6. .net反编译的九款神器(转载)

    .net反编译的九款神器  转载来源: https://www.cnblogs.com/zsuxiong/p/5117465.html 本人搜集了下8款非常不错的.Net反编译利器: 1.Reflec ...

  7. C#异步线程

    对需要同时进行的操作进行异步线程处理:例如在一个button按钮点击事件中同时进行两种事件操作private void button_Click(object sender, EventArgs e) ...

  8. JSJ—编译器与虚拟机哪个重要?

    阅读本文约“2分钟” 熟悉Java的朋友都知道虚拟机还有编译器,那么它们各自主要的功能是什么?谁比较重要呢?让我们来了解一下这两位美女的故事. 虚拟机可以说就是Java,她能让程序运行起来. 但是编译 ...

  9. JavaWeb学习日记----表单提交方式

    1.表单提交方式 (1) 使用input控件中的submit提交 代码如下: <!DOCTYPE html> <html lang="en"> <he ...

  10. 2018-08-13 中文编程讨论组(GitHub)社区守则一周年修订

    原址在此 社区守则 大原则 求同存异 就事论事 己所不欲勿施于人 注: 在讨论组成立一周年之际, 对行为规范进行一些细化 内 这部分所有内容同样适用于对外 回归技术 所有与中文编程没有直接关系的话题都 ...