主要内容

pdist

两两之间的距离对观测

描述

例子

D= pdist (X)返回对观测之间的欧氏距离X

例子

D= pdist (X,距离)使用指定的方法返回的距离距离

例子

D= pdist (X,距离,DistParameter)使用指定的方法返回的距离距离DistParameter。您可以指定DistParameter只有当距离“seuclidean”,闵可夫斯基的,或“mahalanobis”

例子

D = pdist (X,距离CacheSize =缓存)D = pdist (X,距离,DistParameterCacheSize =缓存)使用一个缓存的大小缓存兆字节加速欧几里得距离的计算。这种说法只适用于当距离“fasteuclidean”,“fastsquaredeuclidean”,或“fastseuclidean”

例子

全部折叠

计算之间的欧氏距离对观测,使用距离矢量转换为一个矩阵squareform

创建一个矩阵和三个观察和两个变量。

rng (“默认”)%的再现性X =兰德(3 2);

计算欧氏距离。

D = pdist (X)
D =1×30.2954 1.0670 0.9448

成对的距离排列的顺序(2,1),(1),(2)。你可以很容易地定位观测之间的距离j通过使用squareform

Z = squareform (D)
Z =3×30 0 0.2954 1.0670 0.2954 0.9448 1.0670 0.9448 0

squareform返回一个对称矩阵Z (i, j)对应于两两之间的距离观察j。例如,您可以找到观察2和3之间的距离。

Z (2、3)
ans = 0.9448

通过Zsquareform复制的输出函数pdist函数。

y = squareform (Z)
y =1×30.2954 1.0670 0.9448

输出ysquareformDpdist都是一样的。

创建一个矩阵和三个观察和两个变量。

rng (“默认”)%的再现性X =兰德(3 2);

使用默认计算闵可夫斯基距离指数2。

D1 = pdist (X,闵可夫斯基的)
D1 =1×30.2954 1.0670 0.9448

计算闵可夫斯基距离指数为1,等于该街区距离。

D2 = pdist (X,闵可夫斯基的,1)
D2 =1×30.3721 1.5036 1.3136
D3 = pdist (X,“cityblock”)
D3 =1×30.3721 1.5036 1.3136

定义一个自定义距离函数忽略了坐标值,计算两两距离通过使用自定义距离函数。

创建一个矩阵和三个观察和两个变量。

rng (“默认”)%的再现性X =兰德(3 2);

假设第一次观察到的第一个元素是失踪。

X(1,1) =南;

计算欧氏距离。

D1 = pdist (X)
D1 =1×3南南0.9448

如果观察j包含值,函数pdist返回两两之间的距离j。因此,D1(1)和D1(2),两两距离(2,1)和(3,1)值。

定义一个自定义距离函数naneucdist忽略了坐标,值并返回欧几里得距离。

函数D2 = naneucdist (XI, XJ)% NANEUCDIST欧几里得距离忽略坐标nann =大小(XI, 2);sqdx = (xi xj) ^ 2;nstar =总和(~ isnan (sqdx), 2);%的配对数量不包含nannstar (nstar = = 0) =南;%返回NaN如果所有对包括NaND2squared =总和(sqdx 2“omitnan”)。* n / nstar;%失踪坐标校正D2 =√D2squared);

计算距离naneucdist通过传递函数的句柄作为输入参数pdist

D2 = pdist (X, @naneucdist)
D2 =1×30.3974 1.1538 0.9448

创建一个大矩阵的点,然后测量所使用的时间pdist使用默认”欧几里得”距离度量。

rng默认的%的再现性N = 10000;X = randn (N, 1000);D = pdist (X);%热身函数更可靠的计时信息抽搐D = pdist (X);标准= toc
标准= 12.2091

接下来,使用的测量时间pdist“fasteuclidean”距离度量。指定一个缓存大小为10。

D = pdist (X,“fasteuclidean”,CacheSize = 10);%热身函数抽搐D2 = pdist (X,“fasteuclidean”,CacheSize = 10);加速= toc
加速= 1.3007

评估有多少倍的加速计算比较标准。

标准/加速
ans = 9.3863

加速版本对于这个例子计算快三倍。

输入参数

全部折叠

输入数据,指定为一个数字矩阵的大小——- - - - - -n。行对应于个人观察,列对应单个变量。

数据类型:|

距离度量,指定为一个特征向量,字符串标量,或函数处理,如下表所述。

价值 描述
“欧几里得”

欧氏距离(默认)

“squaredeuclidean”

平方欧氏距离。(此选项仅供效率。它不满足三角不等式)。

“seuclidean”

标准化的欧氏距离。每个坐标差异观察是通过除以相应的扩展元素的标准差,S =性病(X, omitnan)。使用DistParameter指定一个不同的值年代

“fasteuclidean” 欧氏距离计算通过使用另一种算法,节省了时间预测的数量至少是10。在某些情况下,这种快速算法可以降低精度。算法开始“快”不支持稀疏数据金宝app。有关详细信息,请参见算法
“fastsquaredeuclidean” 平方欧氏距离计算通过使用另一种算法,节省了时间预测的数量至少是10。在某些情况下,这种快速算法可以降低精度。算法开始“快”不支持稀疏数据金宝app。有关详细信息,请参见算法
“fastseuclidean” 标准化的欧氏距离计算通过使用另一种算法,节省了时间预测的数量至少是10。在某些情况下,这种快速算法可以降低精度。算法开始“快”不支持稀疏数据金宝app。有关详细信息,请参见算法
“mahalanobis”

Mahalanobis距离,计算使用的样本协方差X,C = X (X, omitrows)。使用DistParameter指定一个不同的值C,矩阵C是对称的正定。

“cityblock”

城市街区的距离

闵可夫斯基的

闵可夫斯基距离。默认的指数是2。使用DistParameter指定一个不同的指数P,在那里P是一个积极的标量值的指数。

“chebychev”

Chebychev距离(最大坐标差异)

的余弦

1 -之间的夹角的余弦值点(视为向量)

“相关”

1 -样本点之间的相关性(视为序列值)

“汉明”

汉明距离,协调不同的百分比

“jaccard”

1 - Jaccard系数,非零坐标不同的百分比

“枪兵”

1 -样本之间的斯皮尔曼等级相关的观察(视为序列值)

@distfun

自定义距离函数处理。距离函数的形式

函数ZJ D2 = distfun(子)%计算距离
在哪里

  • 是一个1——- - - - - -n向量包含一个观察。

  • ZJ是一个平方米——- - - - - -n包含多个观测矩阵。distfun必须接受一个矩阵ZJ与任意数量的观察。

  • D2是一个平方米——- - - - - -1距离向量,D2 (k)是观察之间的距离ZJ (k,:)

如果你的数据不是稀疏的,你可以通过使用一个内置的通常更快的计算距离的距离度量,而不是一个函数处理。

定义,请参阅距离度量

当你使用“seuclidean”,闵可夫斯基的,或“mahalanobis”,您可以指定一个额外的输入参数DistParameter控制这些指标。你也可以以同样的方式使用这些指标作为默认值的其他指标DistParameter

例子:闵可夫斯基的

数据类型:字符|字符串|function_handle

距离度量参数值,指定为一个积极的标量,数值向量,或数字矩阵。这个论证是有效的只有当你指定距离作为“seuclidean”,闵可夫斯基的,或“mahalanobis”

  • 如果距离“seuclidean”,DistParameter为每个维度是一个向量扩展因素,指定为一个积极的向量。默认值是性病(X, omitnan)

  • 如果距离闵可夫斯基的,DistParameter的指数是闵可夫斯基距离,指定为一个积极的标量。默认值是2。

  • 如果距离“mahalanobis”,DistParameter协方差矩阵,指定为一个数字矩阵。默认值是X (X, omitrows)DistParameter必须是对称的,正定。

例子:闵可夫斯基,3

数据类型:|

克以兆字节为单位矩阵的大小,作为一个积极的标量或指定“最大”。的pdist函数可以使用CacheSize =缓存只有当距离参数是“fasteuclidean”,“fastsquaredeuclidean”,或“fastseuclidean”

如果缓存“最大”,pdist整个中间矩阵试图分配足够的内存的大小——- - - - - -,在那里是输入数据的行数X。缓存大小不需要大到足以让整个中间矩阵,但必须至少足够容纳一个1的向量。否则,pdist使用的标准算法计算欧氏距离。

如果论点的距离“fasteuclidean”,“fastsquaredeuclidean”,或“fastseuclidean”缓存太大或价值“最大”,pdist可能会超过可用内存的分配格拉姆矩阵。在这种情况下,MATLAB®一个错误的问题。

例子:“最大”

数据类型:|字符|字符串

输出参数

全部折叠

两两距离,作为数字返回行向量的长度(1)/ 2,相应的对观测,观察的数量吗X

距离的顺序排列(2,1),(3,1),…,(1),(2),…,(,2),…,(,1),即,the lower-left triangle of the——- - - - - -距离矩阵的列顺序。两两之间的距离观察j是在D((张)* (m i / 2) + j-i)j

您可以转换D对称矩阵的使用squareform函数。Z = squareform (D)返回一个——- - - - - -矩阵Z (i, j)对应于两两之间的距离观察j

如果观察j包含年代,那么相应的价值D内置的距离函数。

D通常被用作不同矩阵在集群或多维标度。有关详细信息,请参见分层聚类和函数参考页cmdscale,cophenet,链接,mdscale,optimalleaforder。这些功能需要D作为输入参数。

更多关于

全部折叠

距离度量

距离度量是一个函数,定义了两个观测之间的距离。pdist金宝app支持各种距离度量:欧氏距离、标准化的欧氏距离,Mahalanobis距离,街区距离,闵可夫斯基距离,Chebychev距离,余弦距离、相关距离,汉明距离、Jaccard距离,和枪兵的距离。

给定一个——- - - - - -n数据矩阵X,这被视为(1 -n)行向量x1,x2、……x,各种向量之间的距离x年代xt定义如下:

  • 欧氏距离

    d 年代 t 2 = ( x 年代 x t ) ( x 年代 x t )

    的欧几里得距离是一个特例闵可夫斯基距离,p= 2

  • 标准化的欧几里得距离

    d 年代 t 2 = ( x 年代 x t ) V 1 ( x 年代 x t ) ,

    在哪里Vn——- - - - - -n对角矩阵的jth对角元素是(年代(j))2,在那里年代是一个向量的每个维度的比例因素。

  • Mahalanobis距离

    d 年代 t 2 = ( x 年代 x t ) C 1 ( x 年代 x t ) ,

    在哪里C协方差矩阵。

  • 城市街区的距离

    d 年代 t = j = 1 n | x 年代 j x t j |

    城市街区的距离是一个特例的闵可夫斯基距离,p= 1

  • 闵可夫斯基距离

    d 年代 t = j = 1 n | x 年代 j x t j | p p

    的特殊情况p= 1闵可夫斯基距离给出了城市街区距离。的特殊情况p= 2闵可夫斯基距离给出了欧氏距离。的特殊情况p=∞闵可夫斯基距离给Chebychev距离。

  • Chebychev距离

    d 年代 t = 马克斯 j { | x 年代 j x t j | }

    距离Chebychev闵可夫斯基距离是一个特例,在哪里p=∞

  • 余弦距离

    d 年代 t = 1 x 年代 x t ( x 年代 x 年代 ) ( x t x t )

  • 相关距离

    d 年代 t = 1 ( x 年代 x ¯ 年代 ) ( x t x ¯ t ) ( x 年代 x ¯ 年代 ) ( x 年代 x ¯ 年代 ) ( x t x ¯ t ) ( x t x ¯ t ) ,

    在哪里

    x ¯ 年代 = 1 n j x 年代 j x ¯ t = 1 n j x t j

  • 汉明距离

    d 年代 t = ( # ( x 年代 j x t j ) / n )

  • Jaccard距离

    d 年代 t = # ( ( x 年代 j x t j ) ( ( x 年代 j 0 ) ( x t j 0 ) ) ] # ( ( x 年代 j 0 ) ( x t j 0 ) ]

  • 斯皮尔曼的距离

    d 年代 t = 1 ( r 年代 r ¯ 年代 ) ( r t r ¯ t ) ( r 年代 r ¯ 年代 ) ( r 年代 r ¯ 年代 ) ( r t r ¯ t ) ( r t r ¯ t ) ,

    在哪里

    • rsj的排名是xsj接管x1j,x2j,……x乔丹所计算的tiedrank

    • r年代rt的坐标态等级向量x年代xt,也就是说,r年代= (r年代1,r年代2,……rsn)。

    • r ¯ 年代 = 1 n j r 年代 j = ( n + 1 ) 2

    • r ¯ t = 1 n j r t j = ( n + 1 ) 2

算法

全部折叠

快速欧几里得距离算法

的值距离观点:开始(如“fasteuclidean”“fastseuclidean”)计算欧几里得距离使用一个算法使用额外的内存来节省计算时间。这个算法被命名为“欧几里得距离矩阵技巧”Albanie[1]和其他地方。内部测试表明该算法节省时间当预测的数量至少是10。

找到所有的点之间的距离矩阵Dxxj,每个xn变量,计算距离的算法中使用最后一行以下方程:

D , j 2 = x x j 2 = ( x x j ) T ( x x j ) = x 2 2 x T x j + x j 2

矩阵 x T x j 在最后一行的方程叫做格拉姆矩阵。计算距离平方的速度更快,但略低于数值稳定,当你计算和使用格拉姆矩阵而不是计算的距离平方平方求和。讨论,看到Albanie[1]

储存格拉姆矩阵、软件使用缓存的默认大小1 e3兆字节。你可以设置缓存大小使用缓存论点。如果该值的缓存太大或“最大”,pdist可能会超过可用内存的分配格拉姆矩阵。在这种情况下,MATLAB一个错误的问题。

引用

[1]Albanie,撒母耳。欧氏距离矩阵技巧。2019年6月。可以在https://www.robots.ox.ac.uk/%7Ealbanie/notes/Euclidean_distance_trick.pdf

扩展功能

版本历史

之前介绍过的R2006a

全部展开