paper 120:计算距离矩阵的函数的pdist和pdist2函数

时间:2022-09-18 22:58:27

matlab中自带的计算距离矩阵的函数有两个pdist和pdist2。前者计算一个向量自身的距离矩阵,后者计算两个向量之间的距离矩阵。基本调用形式如下:

D = pdist(X)

D = pdist2(X,Y)

这两个函数都提供多种距离度量形式,非常方便,还可以调用自己编写的距离函数。

需要注意的是:pdist2返回是n*n的距离矩阵,pdist则返回距离矩阵的下三角串联形式。

下面是具体的介绍:

一、pdist
Pairwise distance between pairs of objects
Syntax
D = pdist(X)
D = pdist(X,distance)
Description
D = pdist(X)
计算 X 中各对行向量的相互距离(X是一个m-by-n的矩阵). 这里 D 要特别注意,D 是一个长为m(m–1)/2的行向量.可以这样理解 D 的生成:首先生成一个 X 的距离方阵,由于该方阵是对称的,且对角线上的元素为0,所以取此方阵的下三角元素,按照Matlab中矩阵的按列存储原则,此下三角各元素的索引排列即为(2,1), (3,1), ..., (m,1), (3,2), ..., (m,2), ..., (m,m–1).可以用命令 squareform(D) 将此行向量转换为原距离方阵.(squareform函数是专门干这事的,其逆变换是也是squareform。)
D = pdist(X,distance) 使用指定的距离.distance可以取下面圆括号中的值,用红色标出!
Metrics
Given an m-by-n data matrix X, which is treated as m (1-by-n) row vectors x1, x2, ..., xm, the various distances between the vector xs and xt are defined as follows:
欧几里德距离Euclidean distance('euclidean')
d 2 s,t =(x s x t )(x s x t ) ′  
 
Notice that the Euclidean distance is a special case of the Minkowski metric, where p = 2.
欧氏距离虽然很有用,但也有明显的缺点。
一:它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。
二:它没有考虑各变量的数量级(量纲),容易犯大数吃小数的毛病。所以,可以先对原始数据进行规范化处理再进行距离计算。
 
标准欧几里德距离Standardized Euclidean distance('seuclidean')
d 2 s,t =(x s x t )V 1 (x s x t ) ′  
 
where V is the n-by-n diagonal matrix whose jth diagonal element is S(j)2, where S is the vector of standard deviations.
相比单纯的欧氏距离,标准欧氏距离能够有效的解决上述缺点。注意,这里的V在许多Matlab函数中是可以自己设定的,不一定非得取标准差,可以依据各变量的重要程度设置不同的值,如knnsearch函数中的Scale属性。
 
马哈拉诺比斯距离Mahalanobis distance('mahalanobis')
d 2 s,t =(x s x t )C 1 (x s x t ) ′  
 
where C is the covariance matrix.
马氏距离是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧式距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。
如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧式距离,如果协方差矩阵为对角阵,则其也可称为正规化的欧氏距离.
马氏优缺点:
  1)马氏距离的计算是建立在总体样本的基础上的,因为C是由总样本计算而来,所以马氏距离的计算是不稳定的;
  2)在计算马氏距离过程中,要求总体样本数大于样本的维数。
  3)协方差矩阵的逆矩阵可能不存在。 
 
曼哈顿距离(城市区块距离)City block metric('cityblock')
d s,t =∑ j=1 n ∣ ∣ x s j  x t j  ∣ ∣  
 
Notice that the city block distance is a special case of the Minkowski metric, where p=1.
 
闵可夫斯基距离Minkowski metric('minkowski')
d s,t =∑ j=1 n ∣ ∣ x s j  x t j  ∣ ∣  p    p  
 
Notice that for the special case of p = 1, the Minkowski metric gives the city block metric, for the special case of p = 2, the Minkowski metric gives the Euclidean distance, and for the special case of p = ∞, the Minkowski metric gives the Chebychev distance.
闵可夫斯基距离由于是欧氏距离的推广,所以其缺点与欧氏距离大致相同。
 
切比雪夫距离Chebychev distance('chebychev')
d s,t =max j ∣ ∣ x s j  x t j  ∣ ∣  
 
Notice that the Chebychev distance is a special case of the Minkowski metric, where p = ∞.
 
夹角余弦距离Cosine distance('cosine')
d s,t =1x s x t  ′  ∥x s ∥ 2 ∥x t ∥ 2    
 
与Jaccard距离相比,Cosine距离不仅忽略0-0匹配,而且能够处理非二元向量,即考虑到变量值的大小。
 
相关距离Correlation distance('correlation')
d s,t =1x s x t  ′  (x s x s  ˉ ˉ ˉ  )(x s x s  ˉ ˉ ˉ  ) ′   √ (x t x t  ˉ ˉ ˉ  )(x t x t  ˉ ˉ ˉ  ) ′   √    
 
Correlation距离主要用来度量两个向量的线性相关程度。
汉明距离Hamming distance('hamming')
d s,t =(#(x s j  ≠x t j  ) n  ) 
 
两个向量之间的汉明距离的定义为两个向量不同的变量个数所占变量总数的百分比。
 
杰卡德距离Jaccard distance('jaccard')
d s,t =#[(x s j  ≠x t j  )∩((x s j  ≠0)∪(x t j  ≠0))] #[(x s j  ≠0)∪(x t j  ≠0)]   
 
Jaccard距离常用来处理仅包含非对称的二元(0-1)属性的对象。很显然,Jaccard距离不关心0-0匹配,而Hamming距离关心0-0匹配。
 
Spearman distance('spearman')
d s,t =1(r s r s  ˉ ˉ ˉ  )(r t r t  ˉ ˉ ˉ  ) ′  (r s r s  ˉ ˉ ˉ  )(r s r s  ˉ ˉ ˉ  ) ′   √ (r t r t  ˉ ˉ ˉ  )(r t r t  ˉ ˉ ˉ  ) ′   √    
 
where
rsj is the rank of xsj taken over x1j, x2j, ...xmj, as computed by tiedrank
rs and rt are the coordinate-wise rank vectors of xs and xt, i.e., rs = (rs1, rs2, ... rsn)
r s  ˉ ˉ ˉ  =1 n  ∑ j r s j  =n+1 2   
r t  ˉ ˉ ˉ  =1 n  ∑ j r t j  =n+1 2   
二、pdist2
Pairwise distance between two sets of observations
Syntax
D = pdist2(X,Y)
D = pdist2(X,Y,distance)
D = pdist2(X,Y,'minkowski',P)
D = pdist2(X,Y,'mahalanobis',C)
D = pdist2(X,Y,distance,'Smallest',K)
D = pdist2(X,Y,distance,'Largest',K)
[D,I] = pdist2(X,Y,distance,'Smallest',K)
[D,I] = pdist2(X,Y,distance,'Largest',K)
Description
这里 X 是 mx-by-n 维矩阵,Y 是 my-by-n 维矩阵,生成 mx-by-my 维距离矩阵 D。
[D,I] = pdist2(X,Y,distance,'Smallest',K)
生成 K-by-my 维矩阵 D 和同维矩阵 I,其中D的每列是原距离矩阵中最小的元素,按从小到大排列,I 中对应的列即为其索引号。注意,这里每列各自独立地取 K 个最小值。
例如,令原mx-by-my 维距离矩阵为A,则 K-by-my 维矩阵 D 满足 D(:,j)=A(I(:,j),j).
 
此外,

MATLAB 距离计算

判别分析时,通常涉及到计算两个样本之间的距离,多元统计学理论中有多种距离计算公式。MATLAB中已有对应函数,可方便直接调用计算。距离函数有:pdist, pdist2, mahal, squareform, mdscale, cmdscale

主要介绍pdist2 ,其它可参考matlab help

D = pdist2(X,Y)
D = pdist2(X,Y,distance)
D = pdist2(X,Y,'minkowski',P)
D = pdist2(X,Y,'mahalanobis',C)
D = pdist2(X,Y,distance,'Smallest',K)
D = pdist2(X,Y,distance,'Largest',K)
[D,I] = pdist2(X,Y,distance,'Smallest',K)
[D,I] = pdist2(X,Y,distance,'Largest',K)

练习:

2种计算方式,一种直接利用pdist计算,另一种按公式(见最后理论)直接计算。

% distance

clc;clear;
x = rand(4,3)
y = rand(1,3)

for i =1:size(x,1)
    for j =1:size(y,1)
        a = x(i,:); b=y(j,:);
       
%         Euclidean distance
        d1(i,j)=sqrt((a-b)*(a-b)');
       
%         Standardized Euclidean distance
        V = diag(1./std(x).^2);
        d2(i,j)=sqrt((a-b)*V*(a-b)');
       
%         Mahalanobis distance
        C = cov(x);
        d3(i,j)=sqrt((a-b)*pinv(C)*(a-b)');
       
%         City block metric
        d4(i,j)=sum(abs(a-b));
       
%         Minkowski metric
        p=3;
        d5(i,j)=(sum(abs(a-b).^p))^(1/p);
       
%         Chebychev distance
        d6(i,j)=max(abs(a-b));
       
%         Cosine distance
        d7(i,j)=1-(a*b')/sqrt(a*a'*b*b');
       
%         Correlation distance
        ac = a-mean(a); bc = b-mean(b);       
        d8(i,j)=1- ac*bc'/(sqrt(sum(ac.^2))*sqrt(sum(bc.^2)));

end
end

md1 = pdist2(x,y,'Euclidean');

md2 = pdist2(x,y,'seuclidean');

md3 = pdist2(x,y,'mahalanobis');

md4 = pdist2(x,y,'cityblock');

md5 = pdist2(x,y,'minkowski',p);

md6 = pdist2(x,y,'chebychev');

md7 = pdist2(x,y,'cosine');

md8 = pdist2(x,y,'correlation');

md9 = pdist2(x,y,'hamming');

md10 = pdist2(x,y,'jaccard');
md11 = pdist2(x,y,'spearman');

D1=[d1,md1],D2=[d2,md2],D3=[d3,md3]

D4=[d4,md4],D5=[d5,md5],D6=[d6,md6]

D7=[d7,md7],D8=[d8,md8]

md9,md10,md11

运行结果如下:

x =

0.5225    0.6382    0.6837
    0.3972    0.5454    0.2888
    0.8135    0.0440    0.0690
    0.6608    0.5943    0.8384

y =

0.5898    0.7848    0.4977

D1 =

0.2462    0.2462
    0.3716    0.3716
    0.8848    0.8848
    0.3967    0.3967

D2 =

0.8355    0.8355
    1.5003    1.5003
    3.1915    3.1915
    1.2483    1.2483

D3 =

439.5074  439.5074
  437.5606  437.5606
  438.3339  438.3339
  437.2702  437.2702

D4 =

0.3999    0.3999
    0.6410    0.6410
    1.3934    1.3934
    0.6021    0.6021

D5 =

0.2147    0.2147
    0.3107    0.3107
    0.7919    0.7919
    0.3603    0.3603

D6 =

0.1860    0.1860
    0.2395    0.2395
    0.7409    0.7409
    0.3406    0.3406

D7 =

0.0253    0.0253
    0.0022    0.0022
    0.3904    0.3904
    0.0531    0.0531

D8 =

1.0731    1.0731
    0.0066    0.0066
    1.2308    1.2308
    1.8954    1.8954

md9 =

1
     1
     1
     1

md10 =

1
     1
     1
     1

md11 =

1.5000
    0.0000
    1.5000
    2.0000

基本理论公式如下:

paper 120:计算距离矩阵的函数的pdist和pdist2函数

paper 120:计算距离矩阵的函数的pdist和pdist2函数
paper 120:计算距离矩阵的函数的pdist和pdist2函数
 
 
 
 
 

paper 120:计算距离矩阵的函数的pdist和pdist2函数的更多相关文章

  1. Keil C51 中的函数指针和再入函数

    函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...

  2. JavaScript (四) js的基本语法 - - 函数练习、arguments、函数定义、作用域、预解析

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.函数练习 1.求最值 // - 求2个数中的最大值 function getMax(num1, nu ...

  3. Sql Server函数全解<一>字符串函数

    阅读目录 1.ASCII()函数 2.CHAR()函数 3.LEFT()函数 4.RIGHT()函数 5.LTRIM()函数 6.RTRIM()函数 7.STR()函数 8.字符串逆序的函数REVER ...

  4. Sql Server函数全解(一)字符串函数

    字符串函数用于对字符和二进制字符进行各种操作 1.ASCII()函数  ASCII(character_expression)函数用于返回字符串表达式中最左侧的ASCII代码值.参数character ...

  5. sql server ,OVER(PARTITION BY)函数用法,开窗函数,over子句,over开窗函数

    https://technet.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx https://social.msdn.microsoft.c ...

  6. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

  7. Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  8. Shell函数:Shell函数返回值、删除函数、在终端调用函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...

  9. [php基础]Mysql日期函数:日期时间格式转换函数详解

    在PHP网站开发中,Mysql数据库设计中日期时间字段必不可少,由于Mysql日期函数输出的日期格式与PHP日期函数之间的日期格式兼容性不够,这就需要根据网站实际情况使用Mysql或PHP日期转换函数 ...

随机推荐

  1. HTML5的File API读取文件信息

    html结构: <div id="fileImage"></div> <input type="file" value=&quot ...

  2. 【日记】搭建一个node本地服务器

    用node搭建一个本地http服务器.首先了解htpp服务器原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型 ...

  3. 面向小白的JS笔记 - &num;Codecademy&num;学习笔记

    前言 最初浏览过<JavaScript秘密花园>,前一段时间读过一点点<JavaScript语言精粹>和一点点<JavaScript高级程序设计>(一点点是指都只是 ...

  4. MySQL5&period;7更改密码时出现ERROR 1054 &lpar;42S22&rpar;&colon; Unknown column &&num;39&semi;password&&num;39&semi; in &&num;39&semi;field list&&num;39&semi;

    转自:http://blog.csdn.net/u010603691/article/details/50379282 新安装的MySQL5.7,登录时提示密码错误,安装的时候并没有更改密码,后来通过 ...

  5. UVA 657 The die is cast

      The die is cast  InterGames is a high-tech startup company that specializes in developing technolo ...

  6. struts2入门

    好久没有动博客了.今天看了一下慕课网的视频,简单了解一下struts2. 首先是在项目中引入struts2的文件,有一个比较简单的方法就是可以直接右键项目MyEclipse->Project f ...

  7. 【cocos 2d-x】VS2013&plus;cocos2d-x3&period;3Final&plus;Adriod交叉编译环境配置(超详细版)

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

  8. 调皮的程序员:Linux之父雕刻在Linux内核中的故事

    本文内容由公众号“格友”原创分享. 1.引言   (不羁的大神,连竖中指都这么帅) 因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人.虽然大家可能都听过钱钟书先生的名言:“假如你吃 ...

  9. MySql cmd下的学习笔记 —— 有关表的操作(对表的增删改查)

    create table 表名 ( 列名1 列属性, 列名2 列属性 ... ... 列名n 列属性 )engine myisam charset utf8; (增加表的一列) (一)在表的最末列增加 ...

  10. python正则检测密码合法性

    客户系统升级,要求用户密码符合一定的规则,即:包含大小写字母.数字.符号,长度不小于8,于是先用python写了个简单的测试程序: #encoding=utf-8 #----------------- ...