主要内容

pdist2

两组观测值之间的成对距离

描述

例子

D= pdist2 (X, Y距离返回每对观测值之间的距离X而且Y所指定的度量距离

例子

D= pdist2 (X, Y距离DistParameter所指定的度量返回距离距离而且DistParameter.你可以指定DistParameter只有当距离“seuclidean”闵可夫斯基的,或“mahalanobis”

D= pdist2 (___名称,值使用名称-值对参数之一指定附加选项“最小”“最大”除了前面语法中的任何参数之外。

例如,

  • D = pdist2(X,Y,距离,'最小',K)使用指定的度量计算距离距离并返回K到观测的最小成对距离X对于每一个观察Y按升序排列。

  • D = pdist2(X,Y,距离,DistParameter,'最大',K)使用指定的度量计算距离距离而且DistParameter并返回K按降序排列的最大成对距离。

例子

D= pdist2(___名称,值也返回矩阵.矩阵中观测值的索引X对应于D

例子

全部折叠

用三个观察结果和两个变量创建两个矩阵。

rng (“默认”%用于再现性X = rand(3,2);Y = rand(3,2);

计算欧氏距离。输入参数的默认值距离“欧几里得”.在不使用名称-值对参数计算欧几里得距离时,不需要指定距离

D = pdist2(X,Y)
D =3×30.5387 0.8018 0.1538 0.7100 0.5951 0.3422 0.8805 0.4242 1.2050

D (i, j)对应于观测之间的成对距离X和观察jY

用三个观察结果和两个变量创建两个矩阵。

rng (“默认”%用于再现性X = rand(3,2);Y = rand(3,2);

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

D1 = pdist2(X,Y,闵可夫斯基的
D1 =3×30.5387 0.8018 0.1538 0.7100 0.5951 0.3422 0.8805 0.4242 1.2050

用指数1计算闵可夫斯基距离,它等于城市街区距离。

D2 = pdist2(X,Y,闵可夫斯基的, 1)
D2 =3×30.5877 1.0236 0.2000 0.9598 0.8337 0.3899 1.0189 0.4800 1.7036
D3 = pdist2(X,Y,“cityblock”
D3 =3×30.5877 1.0236 0.2000 0.9598 0.8337 0.3899 1.0189 0.4800 1.7036

用三个观察结果和两个变量创建两个矩阵。

rng (“默认”%用于再现性X = rand(3,2);Y = rand(3,2);

求到观测值的最小的两个成对欧几里得距离X对于每一个观察Y

[D,I] = pdist2(X,Y,“欧几里得”“最小”,2)
D =2×30.5387 0.4242 0.1538 0.7100 0.5951 0.3422
我=2×31 3 1 2 2 2

对于每一个观察Ypdist2找到两个最小的距离通过计算和比较距离值的所有观测X.然后,该函数对的每列中的距离进行排序D按升序排列。中观测值的索引X对应于D

定义一个忽略坐标的自定义距离函数值,并使用自定义距离函数计算成对距离。

用三个观察结果和三个变量创建两个矩阵。

rng (“默认”%用于再现性X = rand(3,3) Y = [X(:,1:2) rand(3,1)]
X = 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575 y = 0.8147 0.9134 0.9649 0.9058 0.6324 0.1576 0.1270 0.0975 0.9706

X和Y的前两列是相同的。假设X (1,1)不见了。

X(1,1) = NaN
X = NaN 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575

计算汉明距离。

D1 = pdist2(X,Y,“汉明”
D1 = NaN NaN 1.0000 0.3333 1.0000 1.0000 0.3333

如果观察X或观察jY包含值,函数pdist2返回对于它们之间的成对距离而且j.因此,D1(1,1)、D1(1,2)、D1(1,3)为值。

定义一个自定义距离函数nanhamdist它忽略了计算汉明距离。当处理大量观测数据时,可以通过遍历数据坐标来更快地计算距离。

函数忽略与nan的坐标的汉明距离[m,p] = size(XJ);Nesum = 0 (m,1);Pstar = 0 (m,1);q = 1: p notnan = ~ (isnan(ξ(q)) | isnan (XJ (:, q)));Pstar = Pstar + notnan;结束D2 = nesum./pstar;

计算距离nanhamdist通过将函数句柄作为的输入参数传递pdist2

D2 = pdist2(X,Y,@nanhamdist)
D2 = 0.5000 1.0000 1.0000 1.0000 0.3333 1.0000 1.0000 1.0000 0.3333

kmeans执行k-表示将数据划分为集群k集群。当您有一个新的数据集要集群时,您可以通过使用来创建包含现有数据和新数据的新集群kmeans.的kmeans函数支持C/ c++代码生成,因此您可以生成接受训练数据并返回聚类结果的代码,然后将代码部署到设备上。在这个工作流中,您必须传递训练数据,这些数据可能相当大。为了节省设备内存,可以将训练和预测分开使用kmeans而且pdist2,分别。

使用kmeans在MATLAB®中创建集群并使用pdist2在生成的代码中为现有集群分配新数据。对于代码生成,定义一个入口点函数,该函数接受聚类质心位置和新数据集,并返回最近的聚类索引。然后,生成入口点函数的代码。

生成C/ c++代码需要MATLAB®Coder™。

执行k聚类则

使用三个分布生成一个训练数据集。

rng (“默认”%用于再现性X = [randn(100,2)*0.75+ones(100,2);randn(100 2) * 0.5的(100 2);randn (100 2) * 0.75);

将训练数据划分为三个聚类kmeans

[idx,C] = kmeans(X,3);

绘制聚类和聚类质心。

图gscatter (X (: 1), (:, 2), idx,“bgm”)举行情节(C (: 1), C (:, 2),“kx”)传说(“集群1”《集群2》“集群3”聚类质心的

图中包含一个轴对象。axis对象包含4个line类型的对象。这些对象表示集群1、集群2、集群3和集群中心。

向现有集群分配新数据

生成一个测试数据集。

Xtest = [randn(10,2)*0.75+ones(10,2);randn(10, 2) * 0.5的(10,2);randn (10, 2) * 0.75);

使用现有的集群对测试数据集进行分类。使用,找到离每个测试数据点最近的质心pdist2

[~,idx_test] = pdist2(C,Xtest,“欧几里得”“最小”1);

用标绘测试数据并标记测试数据idx_test通过使用gscatter

gscatter (Xtest (: 1) Xtest (:, 2), idx_test,“bgm”“哦”)传说(“集群1”《集群2》“集群3”聚类质心的“数据分类到集群1”“数据分类到群集2”“数据分类到集群3”

图中包含一个轴对象。axis对象包含7个line类型的对象。这些对象分别表示集群1、集群2、集群3、集群质心、集群1中的数据、集群2中的数据、集群3中的数据。

生成代码

生成将新数据分配给现有集群的C代码。注意,生成C/ c++代码需要MATLAB®Coder™。

定义名为findNearestCentroid它接受质心位置和新数据,然后通过使用找到最近的群集pdist2

添加% # codegen编译器指令(或pragma)到函数入口点之后的函数签名,以表明您打算为MATLAB算法生成代码。添加此指令将指导MATLAB代码分析器帮助您诊断和修复在代码生成过程中可能导致错误的违规行为。

类型findNearestCentroid显示“findNearestCentroid.m”的内容
函数idx = findNearestCentroid(C,X) %#codegen [~,idx] = pdist2(C,X,'欧几里得','最小',1);找到最近的质心

注意:如果单击该页右上方部分的按钮并在MATLAB®中打开此示例,则MATLAB®将打开示例文件夹。此文件夹包括入口点函数文件。

使用以下命令生成代码codegen(MATLAB编码器).因为C和c++都是静态类型语言,所以必须在编译时确定入口点函数中所有变量的属性。的输入的数据类型和数组大小findNearestCentroid,传递一个MATLAB表达式,该表达式表示具有特定数据类型和数组大小的值集arg游戏选择。详细信息请参见为代码生成指定可变大小的参数

codegenfindNearestCentroidarg游戏{C, Xtest}
代码生成成功。

codegen生成MEX函数findNearestCentroid_mex使用依赖于平台的扩展。

验证生成的代码。

myIndx = findNearestCentroid(C,Xtest);myIndex_mex = findnearestcentrroid_mex (C,Xtest);verifyMEX = isequal(idx_test, myindex,myIndex_mex)
verifyMEX =逻辑1

isequal返回逻辑1 (真正的),这意味着所有的输入都是相等的。这一比较证实了pdist2函数,findNearestCentroid函数,和MEX函数返回相同的索引。

您还可以使用GPU Coder™生成优化的CUDA®代码。

cfg = code . gpuconfig (墨西哥人的);codegen配置cfgfindNearestCentroidarg游戏{C, Xtest}

有关代码生成的更多信息,请参见通用代码生成工作流程.有关GPU编码器的更多信息,请参见开始使用GPU编码器(GPU编码器)而且支持功能(GPU编码器)

输入参数

全部折叠

输入数据,指定为数字矩阵。X是一个mx——- - - - - -n矩阵和Y是一个我的——- - - - - -n矩阵。行对应单独的观察结果,列对应单独的变量。

数据类型:|

距离度量,指定为字符向量、字符串标量或函数句柄,如下表所示。

价值 描述
“欧几里得”

欧式距离(默认值)。

“squaredeuclidean”

欧式距离的平方。(此选项仅为提高效率而提供。它不满足三角形不等式。)

“seuclidean”

标准化欧氏距离。观测值之间的每个坐标差都通过除以相应的标准偏差元素来缩放,S = std(X,'omitnan').使用DistParameter为指定另一个值年代

“mahalanobis”

的样本协方差的马氏距离XC = cov(X,'omitrows').使用DistParameter为指定另一个值C,其中矩阵C是对称且正定的。

“cityblock”

城市街区距离。

闵可夫斯基的

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

“chebychev”

切比雪夫距离(最大坐标差)。

的余弦

1减去点间夹角的余弦(作为向量)。

“相关”

1减去点之间的样本相关性(作为值序列处理)。

“汉明”

汉明距离,也就是不同坐标的百分比。

“jaccard”

1减去杰卡德系数,也就是非零坐标的百分比。

“枪兵”

1减去观测值之间的样本斯皮尔曼秩相关(被视为值序列)。

@distfun

自定义距离函数句柄。距离函数有这样的形式

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

  • 是一个1——- - - - - -n包含单个观测值的向量。

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

  • D2是一个平方米——- - - - - -1距离向量,和D2 (k)观测值之间的距离是多少而且ZJ (k,:)

如果数据不是稀疏的,通常可以通过使用内置距离而不是函数句柄来更快地计算距离。

有关定义,请参见距离度量

当你使用“seuclidean”闵可夫斯基的,或“mahalanobis”,您可以指定一个额外的输入参数DistParameter控制这些指标。您还可以以与其他缺省值相同的方式使用这些指标DistParameter

例子:闵可夫斯基的

距离度量参数值,指定为正标量、数值向量或数值矩阵。此参数仅在指定时有效距离作为“seuclidean”闵可夫斯基的,或“mahalanobis”

  • 如果距离“seuclidean”DistParameter是每个维度的比例因子向量,指定为正向量。默认值为性病(X, omitnan)

  • 如果距离闵可夫斯基的DistParameter为闵可夫斯基距离的指数,指定为正标量。缺省值为2。

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

例子:闵可夫斯基,3

数据类型:|

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

例子:要么“最小”,K“最大”,K.你不能两者都用“最小”而且“最大”

要查找的最小距离数,指定为逗号分隔的对,由“最小”一个正整数。如果你指定“最小”,然后pdist2的每一列中的距离排序D按升序排列。

例子:“最小”,3

数据类型:|

要查找的最大距离数,指定为逗号分隔的对,由“最大”一个正整数。如果你指定“最大”,然后pdist2的每一列中的距离排序D按降序排列。

例子:“最大”,3

数据类型:|

输出参数

全部折叠

成对距离,作为数字矩阵返回。

如果您没有指定任何一个“最小”“最大”,然后D是一个mx——- - - - - -我的矩阵,mx而且我的观察的数量在吗X而且Y,分别。D (i, j)是观察之间的距离吗X和观察jY.如果观察X或观察jY包含,然后D (i, j)对于内置的距离函数。

如果你指定了其中之一“最小”“最大”作为K,然后D是一个K——- - - - - -我的矩阵。D包含K最小的或K到观测的最大成对距离X对于每一个观察Y.对于每一个观察Ypdist2找到了K最小或最大距离通过计算和比较距离值的所有观测X.如果K大于mxpdist2返回一个mx——- - - - - -我的矩阵。

排序索引,作为正整数矩阵返回。尺寸和D中观测值的索引X对应于D

更多关于

全部折叠

距离度量

距离度量是定义两个观测值之间距离的函数。pdist2支持各种距离度量:欧几里得距离、标准化欧几里得距离、马氏距离、城市街区距离、闵可夫斯基距离、切比雪夫距离、余弦距离、相关距离、汉明距离、杰卡德距离和斯皮曼距离。

给定一个mx——- - - - - -n数据矩阵X,则视为mx(1 -n)行向量x1x2、……xmx,以及我的——- - - - - -n数据矩阵Y,则视为我的(1 -n)行向量y1y2、……y我的,向量之间的不同距离x年代而且yt定义如下:

  • 欧氏距离

    d 年代 t 2 x 年代 y t x 年代 y t

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

  • 标准化欧氏距离

    d 年代 t 2 x 年代 y t V 1 x 年代 y t

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

  • Mahalanobis距离

    d 年代 t 2 x 年代 y t C 1 x 年代 y t

    在哪里C是协方差矩阵。

  • 城市街区距离

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

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

  • 闵可夫斯基距离

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

    对于特殊情况p= 1,闵可夫斯基距离为街区距离。对于特殊情况p= 2,闵可夫斯基距离为欧几里得距离。对于特殊情况p=∞,闵可夫斯基距离为切比雪夫距离。

  • Chebychev距离

    d 年代 t 马克斯 j | x 年代 j y t j |

    切比雪夫距离是闵可夫斯基距离的一种特殊情况,其中p=∞

  • 余弦距离

    d 年代 t 1 x 年代 y t x 年代 x 年代 y t y t

  • 相关距离

    d 年代 t 1 x 年代 x ¯ 年代 y t y ¯ t x 年代 x ¯ 年代 x 年代 x ¯ 年代 y t y ¯ t y t y ¯ t

    在哪里

    x ¯ 年代 1 n j x 年代 j

    而且

    y ¯ t 1 n j y t j

  • 汉明距离

    d 年代 t x 年代 j y t j / n

  • Jaccard距离

    d 年代 t x 年代 j y t j x 年代 j 0 y t j 0 x 年代 j 0 y t j 0

  • 斯皮尔曼的距离

    d 年代 t 1 r 年代 r ¯ 年代 r t r ¯ t r 年代 r ¯ 年代 r 年代 r ¯ 年代 r t r ¯ t r t r ¯ t

    在哪里

    • rsjxsj接管x1jx2j,……xmx j,按tiedrank

    • rtjytj接管y1jy2j,……y我,我,按tiedrank

    • r年代而且rt的坐标秩向量是x年代而且yt,也就是说,r年代= (r年代1r年代2,……rsn),rt= (rt1rt2,……rtn).

    • r ¯ 年代 1 n j r 年代 j n + 1 2

    • r ¯ t 1 n j r t j n + 1 2

扩展功能

版本历史

在R2010a中引入

Baidu
map