pdist2
两组观测值之间的成对距离
语法
描述
所指定的度量返回距离D
= pdist2 (X, Y
,距离
,DistParameter
)距离
而且DistParameter
.你可以指定DistParameter
只有当距离
是“seuclidean”
,闵可夫斯基的
,或“mahalanobis”
.
例子
计算欧氏距离
用三个观察结果和两个变量创建两个矩阵。
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
和观察j
在Y
.
计算闵可夫斯基距离
用三个观察结果和两个变量创建两个矩阵。
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
对于每一个观察Y
,pdist2
找到两个最小的距离通过计算和比较距离值的所有观测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
或观察j
在Y
包含南
值,函数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
向现有集群分配新数据并生成C/ c++代码
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”,聚类质心的)
向现有集群分配新数据
生成一个测试数据集。
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”)
生成代码
生成将新数据分配给现有集群的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, Y
- - - - - -输入数据
数字矩阵
输入数据,指定为数字矩阵。X
是一个mx——- - - - - -n矩阵和Y
是一个我的——- - - - - -n矩阵。行对应单独的观察结果,列对应单独的变量。
数据类型:单
|双
距离
- - - - - -距离度量
特征向量|字符串标量|函数处理
距离度量,指定为字符向量、字符串标量或函数句柄,如下表所示。
价值 | 描述 |
---|---|
“欧几里得” |
欧式距离(默认值)。 |
“squaredeuclidean” |
欧式距离的平方。(此选项仅为提高效率而提供。它不满足三角形不等式。) |
“seuclidean” |
标准化欧氏距离。观测值之间的每个坐标差都通过除以相应的标准偏差元素来缩放, |
“mahalanobis” |
的样本协方差的马氏距离 |
“cityblock” |
城市街区距离。 |
闵可夫斯基的 |
闵可夫斯基距离。默认指数为2。使用 |
“chebychev” |
切比雪夫距离(最大坐标差)。 |
的余弦 |
1减去点间夹角的余弦(作为向量)。 |
“相关” |
1减去点之间的样本相关性(作为值序列处理)。 |
“汉明” |
汉明距离,也就是不同坐标的百分比。 |
“jaccard” |
1减去杰卡德系数,也就是非零坐标的百分比。 |
“枪兵” |
1减去观测值之间的样本斯皮尔曼秩相关(被视为值序列)。 |
@ |
自定义距离函数句柄。距离函数有这样的形式 函数D2 = distfun(ZI,ZJ)距离计算%…
如果数据不是稀疏的,通常可以通过使用内置距离而不是函数句柄来更快地计算距离。 |
有关定义,请参见距离度量.
当你使用“seuclidean”
,闵可夫斯基的
,或“mahalanobis”
,您可以指定一个额外的输入参数DistParameter
控制这些指标。您还可以以与其他缺省值相同的方式使用这些指标DistParameter
.
例子:闵可夫斯基的
DistParameter
- - - - - -距离度量参数值
积极的标量|数值向量|数字矩阵
距离度量参数值,指定为正标量、数值向量或数值矩阵。此参数仅在指定时有效距离
作为“seuclidean”
,闵可夫斯基的
,或“mahalanobis”
.
如果
距离
是“seuclidean”
,DistParameter
是每个维度的比例因子向量,指定为正向量。默认值为性病(X, omitnan)
.如果
距离
是闵可夫斯基的
,DistParameter
为闵可夫斯基距离的指数,指定为正标量。缺省值为2。如果
距离
是“mahalanobis”
,DistParameter
协方差矩阵,指定为数值矩阵。默认值为X (X, omitrows)
.DistParameter
必须是对称且正定的。
例子:闵可夫斯基,3
数据类型:单
|双
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字
在报价。
例子:要么“最小”,K
或“最大”,K
.你不能两者都用“最小”
而且“最大”
.
输出参数
D
-成对距离
数字矩阵
成对距离,作为数字矩阵返回。
如果您没有指定任何一个“最小”
或“最大”
,然后D
是一个mx——- - - - - -我的矩阵,mx而且我的观察的数量在吗X
而且Y
,分别。D (i, j)
是观察之间的距离吗我
在X
和观察j
在Y
.如果观察我在X
或观察j在Y
包含南
,然后D (i, j)
是南
对于内置的距离函数。
如果你指定了其中之一“最小”
或“最大”
作为K
,然后D
是一个K
——- - - - - -我的矩阵。D
包含K
最小的或K
到观测的最大成对距离X
对于每一个观察Y
.对于每一个观察Y
,pdist2
找到了K
最小或最大距离通过计算和比较距离值的所有观测X
.如果K
大于mx,pdist2
返回一个mx——- - - - - -我的矩阵。
我
-排序索引
正整数矩阵
排序索引,作为正整数矩阵返回。我
尺寸和D
.我
中观测值的索引X
对应于D
.
更多关于
距离度量
距离度量是定义两个观测值之间距离的函数。pdist2
支持各种距离度量:欧几里得距离、标准化欧几里得距离、马氏距离、城市街区距离、闵可夫斯基距离、切比雪夫距离、余弦距离、相关距离、汉明距离、杰卡德距离和斯皮曼距离。
给定一个mx——- - - - - -n数据矩阵X,则视为mx(1 -n)行向量x1,x2、……xmx,以及我的——- - - - - -n数据矩阵Y,则视为我的(1 -n)行向量y1,y2、……y我的,向量之间的不同距离x年代而且yt定义如下:
欧氏距离
欧几里得距离是闵可夫斯基距离的一个特例,其中p= 2.
标准化欧氏距离
在哪里V是n——- - - - - -n对角矩阵j第Th对角线元素为(年代(j))2,在那里年代是每个维度的比例因子的向量。
Mahalanobis距离
在哪里C是协方差矩阵。
城市街区距离
城市街区距离是闵可夫斯基距离的一个特例,其中p= 1.
闵可夫斯基距离
对于特殊情况p= 1,闵可夫斯基距离为街区距离。对于特殊情况p= 2,闵可夫斯基距离为欧几里得距离。对于特殊情况p=∞,闵可夫斯基距离为切比雪夫距离。
Chebychev距离
切比雪夫距离是闵可夫斯基距离的一种特殊情况,其中p=∞.
余弦距离
相关距离
在哪里
而且
汉明距离
Jaccard距离
斯皮尔曼的距离
在哪里
扩展功能
高大的数组
使用行数超过内存容量的数组进行计算。
C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
距离输入参数值(
距离
)必须是编译时常数。例如,要使用闵可夫斯基距离,包括coder.Constant(闵可夫斯基)
在arg游戏
的价值codegen
.距离输入参数值(
距离
)不能是自定义距离函数。名称-值参数中的名称必须是编译时常量。例如,使用
“最小”
所生成代码中的名称-值对参数,包括{coder.Constant(最小的),0}
在arg游戏
的价值codegen
(MATLAB编码器).生成的代码中绑定距离的排序顺序可以与MATLAB中的顺序不同®由于数值精度。
的生成代码
pdist2
使用parfor
(MATLAB编码器)在生成的代码中创建在受支持的共享内存多核平台上并行运行的循环。如果您的编译器不支持开放多处理(OpenMP)应用程序接口或禁用OpenMP库,MATLAB编码器™将parfor
循环,为
循环。要查找受支持的编译器,请参见支持编译器.若要禁用OpenMP库,请设置EnableOpenMP
属性假
.详细信息请参见编码器。CodeConfig
(MATLAB编码器).从R2020a开始,
pdist2
返回整数类型(int32
)索引,而不是双精度索引,生成独立的C/ c++代码。因此,当您使用单精度输入时,该函数允许严格的单精度支持。对于MEX代码生成,函数仍然返回双精度指数以匹配MATLAB行为。
有关代码生成的更多信息,请参见代码生成简介而且通用代码生成工作流程.
GPU代码生成
使用GPU Coder™为NVIDIA®GPU生成CUDA®代码。
使用注意事项和限制:
支持的距离输入参数值(
距离
)为优化的CUDA代码“欧几里得”
,“squaredeuclidean”
,“seuclidean”
,“cityblock”
,闵可夫斯基的
,“chebychev”
,的余弦
,“相关”
,“汉明”
,“jaccard”
.距离
不能是自定义距离函数。距离
必须是编译时常数。名-值对参数中的名称必须是编译时常量。
由于数值精度的原因,生成代码中绑定距离的排序顺序可能与MATLAB中的顺序不同。
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
版本历史
在R2010a中引入
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。