pdist
成对观测值之间的两两距离
语法
说明
使用 D
= pdist(X
,Distance
,DistParameter
)Distance
和 DistParameter
指定的方法返回距离。仅当 Distance
是 'seuclidean'
、'minkowski'
或 'mahalanobis'
时,您才能指定 DistParameter
。
D = pdist(
或 X
,Distance
,CacheSize=cache
)D = pdist(
使用大小为 X
,Distance
,DistParameter
,CacheSize=cache
)cache
MB 的缓存来加速欧几里德距离的计算。仅当 Distance
为 'fasteuclidean'
、'fastsquaredeuclidean'
或 'fastseuclidean'
时,此参数才适用。
示例
计算欧几里德距离并将距离向量转换为矩阵
计算成对观测值之间的欧几里德距离,并使用 squareform
将距离向量转换为矩阵。
创建包含三个观测值和两个变量的矩阵。
rng('default') % For reproducibility X = rand(3,2);
计算欧几里德距离。
D = pdist(X)
D = 1×3
0.2954 1.0670 0.9448
两两距离按 (2,1)、(3,1)、(3,2) 顺序排列。通过使用 squareform
,您可以轻松定位观测值 i
和 j
之间的距离。
Z = squareform(D)
Z = 3×3
0 0.2954 1.0670
0.2954 0 0.9448
1.0670 0.9448 0
squareform
返回一个对称矩阵,其中 Z(i,j)
对应于观测值 i
和 j
之间的两两距离。例如,您可以找到观测值 2 和 3 之间的距离。
Z(2,3)
ans = 0.9448
将 Z
传递给 squareform
函数,以重现 pdist
函数的输出。
y = squareform(Z)
y = 1×3
0.2954 1.0670 0.9448
squareform
的输出 y
和 pdist
的输出 D
是相同的。
计算闵可夫斯基距离
创建包含三个观测值和两个变量的矩阵。
rng('default') % For reproducibility X = rand(3,2);
使用默认指数 2 计算闵可夫斯基距离。
D1 = pdist(X,'minkowski')
D1 = 1×3
0.2954 1.0670 0.9448
用指数 1 计算闵可夫斯基距离,它等于城市街区距离。
D2 = pdist(X,'minkowski',1)
D2 = 1×3
0.3721 1.5036 1.3136
D3 = pdist(X,'cityblock')
D3 = 1×3
0.3721 1.5036 1.3136
使用自定义距离函数计算涉及缺失元素的两两距离
定义一个忽略 NaN
值坐标的自定义距离函数,并使用该自定义距离函数计算两两距离。
创建包含三个观测值和两个变量的矩阵。
rng('default') % For reproducibility X = rand(3,2);
假设第一个观测值的第一个元素缺失。
X(1,1) = NaN;
计算欧几里德距离。
D1 = pdist(X)
D1 = 1×3
NaN NaN 0.9448
如果观测值 i
或 j
包含 NaN
值,函数 pdist
为 i
和 j
之间的两两距离返回 NaN
。因此,D1(1) 和 D1(2),即 (2,1) 和 (3,1) 之间的两两距离,是 NaN
值。
定义一个自定义距离函数 naneucdist
,该函数忽略 NaN
值的坐标,并返回欧几里德距离。
function D2 = naneucdist(XI,XJ) %NANEUCDIST Euclidean distance ignoring coordinates with NaNs n = size(XI,2); sqdx = (XI-XJ).^2; nstar = sum(~isnan(sqdx),2); % Number of pairs that do not contain NaNs nstar(nstar == 0) = NaN; % To return NaN if all pairs include NaNs D2squared = sum(sqdx,2,'omitnan').*n./nstar; % Correction for missing coordinates D2 = sqrt(D2squared);
将函数句柄作为输入参量传递给 pdist
,以使用 naneucdist
计算该距离。
D2 = pdist(X,@naneucdist)
D2 = 1×3
0.3974 1.1538 0.9448
使用 fasteuclidean
距离加速欧几里德距离计算
创建一个由点组成的大型矩阵,然后测量 pdist
采用默认的 "euclidean"
距离度量时所用的时间。
rng default % For reproducibility N = 10000; X = randn(N,1000); D = pdist(X); % Warm up function for more reliable timing information tic D = pdist(X); standard = toc
standard = 13.3730
接下来,使用 "fasteuclidean"
距离度量来测量 pdist
所用的时间。指定缓存大小为 10。
D = pdist(X,"fasteuclidean",CacheSize=10); % Warm up function tic D2 = pdist(X,"fasteuclidean",CacheSize=10); accelerated = toc
accelerated = 2.0146
计算加速后的计算比标准计算快多少倍。
standard/accelerated
ans = 6.6380
对于此示例,加速版本的计算速度快三倍。
输入参数
X
— 输入数据
数值矩阵
输入数据,指定为大小是 m×n 的数值矩阵。行对应于单个观测值,列对应单个变量。
数据类型: single
| double
Distance
— 距离度量
字符向量 | 字符串标量 | 函数句柄
距离度量,指定为字符向量、字符串标量或函数句柄,如下表中所述。
值 | 描述 |
---|---|
'euclidean' | 欧几里德距离(默认值) |
'squaredeuclidean' | 平方欧几里德距离。(此选项仅用于提高效率。它不满足三角不等式。) |
'seuclidean' | 标准化的欧几里德距离。每个观测值间坐标差都通过除以标准差 |
'fasteuclidean' | 当预测变量的数目至少为 10 时,使用替代算法计算的欧几里德距离,该算法可以节省时间。在某些情况下,这种更快的算法会降低准确度。以 'fast' 开头的算法不支持稀疏数据。有关详细信息,请参阅 算法。 |
'fastsquaredeuclidean' | 当预测变量的数目至少为 10 时,使用替代算法计算的平方欧几里德距离,该算法可以节省时间。在某些情况下,这种更快的算法会降低准确度。以 'fast' 开头的算法不支持稀疏数据。有关详细信息,请参阅 算法。 |
'fastseuclidean' | 当预测变量的数目至少为 10 时,使用替代算法计算的标准化的欧几里德距离,该算法可以节省时间。在某些情况下,这种更快的算法会降低准确度。以 'fast' 开头的算法不支持稀疏数据。有关详细信息,请参阅 算法。 |
'mahalanobis' | 马氏距离,使用 |
'cityblock' | 城市街区距离 |
'minkowski' | 闵可夫斯基距离。默认指数是 2。使用 |
'chebychev' | 切比雪夫距离(最大坐标差) |
'cosine' | 1 减去点之间夹角的余弦值(视为向量) |
'correlation' | 1 减去点之间的样本相关性(视为值序列) |
'hamming' | 汉明距离,即相异坐标所占的百分比 |
'jaccard' | 1 减去杰卡德系数,即非零相异坐标所占的百分比 |
'spearman' | 1 减去样本观测值之间的斯皮尔曼秩相关(视为值序列) |
@ | 自定义距离函数句柄。距离函数的形式如下 function D2 = distfun(ZI,ZJ) % calculation of distance ...
对于非稀疏数据,使用内置距离度量计算距离通常比使用函数句柄更快。 |
有关定义,请参阅距离度量。
当您使用 'seuclidean'
、'minkowski'
或 'mahalanobis'
时,您可以指定额外的输入参量 DistParameter
来控制这些度量。您也可以像使用其他度量一样来使用这些度量,但这种情况下使用的是 DistParameter
的默认值。
示例: 'minkowski'
数据类型: char
| string
| function_handle
DistParameter
— 距离度量参数值
正标量 | 数值向量 | 数值矩阵
距离度量参数值,指定为正标量、数值向量或数值矩阵。仅当您将 Distance
指定为 'seuclidean'
、'minkowski'
或 'mahalanobis'
时,此参量才有效。
如果
Distance
是'seuclidean'
,DistParameter
是对应于每个维度的缩放因子的向量,指定为正向量。默认值为std(X,'omitnan')
。如果
Distance
是'minkowski'
,DistParameter
是闵可夫斯基距离的指数,指定为正标量。默认值为 2。如果
Distance
是'mahalanobis'
,DistParameter
是协方差矩阵,指定为数值矩阵。默认值为cov(X,'omitrows')
。DistParameter
必须是对称正定矩阵。
示例: 'minkowski',3
数据类型: single
| double
cache
— 格拉姆矩阵的大小,以 MB 为单位
1e3
(默认) | 正标量 | "maximal"
格拉姆矩阵的大小,以 MB 为单位,指定为正标量或 "maximal"
。仅当 Distance
参量为 'fasteuclidean'
、'fastsquaredeuclidean'
或 'fastseuclidean'
时,pdist
函数才能使用 CacheSize=cache
。
如果 cache
为 "maximal"
,pdist
尝试为大小为 M
×M
的整个中间矩阵分配足够的内存,其中 M
是输入数据 X
的行数。高速缓存的大小不必大到足以容纳整个中间矩阵,但必须至少大到足以容纳一个 M
×1 向量。否则,pdist
使用标准算法来计算欧几里德距离。
如果距离参量为 'fasteuclidean'
、'fastsquaredeuclidean'
或 'fastseuclidean'
,并且 cache
值太大或为 "maximal"
,则 pdist
可能会尝试分配超出可用内存容量的格拉姆矩阵。在这种情况下,MATLAB® 会引发错误。
示例: "maximal"
数据类型: double
| char
| string
输出参量
D
— 两两距离
数值行向量
两两距离,以长度为 m(m–1)/2 的数值行向量形式返回,对应于成对观测值,其中 m 是 X
中的观测值数目。
距离按 (2,1)、(3,1)、...、(m,1)、(3,2)、...、(m,2)、...、(m,m–1) 顺序排列,即按列向排列 m×m 距离矩阵的左下三角元素。观测值 i 和 j 之间的两两距离对应于 D((i-1)*(m-i/2)+j-i),其中 i≤j。
您可以使用 squareform
函数将 D
转换为对称矩阵。Z = squareform(D)
返回 m×m 矩阵,其中 Z(i,j)
对应于观测值 i 和 j 之间的两两距离。
如果观测值 i 或 j 包含 NaN
,则对于内置距离函数,D
中的对应值为 NaN
。
D
通常在聚类或多维尺度分析中用作相异度矩阵。有关详细信息,请参阅Hierarchical Clustering以及 cmdscale
、cophenet
、linkage
、mdscale
和 optimalleaforder
的函数参考页。这些函数接受 D
作为输入参量。
详细信息
距离度量
距离度量是定义两个观测值之间距离的函数。pdist
支持各种距离度量:欧几里德距离、标准化的欧几里德距离、马氏距离、城市街区距离、闵可夫斯基距离、切比雪夫距离、余弦距离、相关性距离、汉明距离、杰卡德距离和斯皮尔曼距离。
给定 m×n 数据矩阵 X
,它被视为 m 个 (1×n) 行向量 x1、x2、...、xm,向量 xs 和 xt 之间的各种距离定义如下:
欧几里德距离
欧几里德距离是闵可夫斯基距离的特例,其中 p = 2。
标准化的欧几里德距离
其中 V 是 n×n 对角矩阵,它的第 j 个对角线元素是 (S(j))2,其中 S 是对应于每个维度的缩放因子的向量。
马氏距离
其中 C 是协方差矩阵。
城市街区距离
城市街区距离是闵可夫斯基距离的特例,其中 p = 1。
闵可夫斯基距离
对于特例 p = 1,闵可夫斯基距离即城市街区距离。对于特例 p = 2,闵可夫斯基距离即欧几里德距离。对于特例 p = ∞,闵可夫斯基距离即切比雪夫距离。
切比雪夫距离
切比雪夫距离是闵可夫斯基距离的特例,其中 p = ∞。
余弦距离
相关性距离
其中
且 。
汉明距离
杰卡德距离
斯皮尔曼 距离
其中
rsj 是在 x1j、x2j、...xmj 上所取的 xsj 的秩,如
tiedrank
计算所得。rs 和 rt 是 xs 和 xt 的基于坐标轴的秩向量,即 rs = (rs1, rs2, ... rsn)。
.
.
算法
快速欧几里德距离算法
以 fast
开头的 Distance
参量(如 'fasteuclidean'
和 'fastseuclidean'
)的值在计算欧几里德距离时使用的算法会使用额外的内存来节省计算时间。此算法在 Albanie 的文献 [1] 中和其他位置称为“欧几里德距离矩阵技巧”。内部测试表明,当预测变量的数目至少为 10 时,该算法可以节省时间。
为了求得所有点 xi 和 xj 之间距离的矩阵 D(其中每个 xi 具有 n 个变量),该算法使用以下方程中的最后一行来计算距离:
方程最后一行中的矩阵 称为格拉姆矩阵。当您计算并使用格拉姆矩阵而不是通过平方与求和来计算平方距离时,计算平方距离集的速度更快,但在数值上稳定性稍差。有关讨论,请参阅 Albanie 的文献 [1]。
为了存储格拉姆矩阵,软件使用默认大小为 1e3
MB 的缓存。您可以使用 cache
参量设置缓存大小。如果 cache
的值太大或为 "maximal"
,pdist
可能会尝试分配超出可用内存容量的格拉姆矩阵。在这种情况下,MATLAB 会引发错误。
参考
[1] Albanie, Samuel. Euclidean Distance Matrix Trick. June, 2019. Available at https://www.robots.ox.ac.uk/%7Ealbanie/notes/Euclidean_distance_trick.pdf.
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
距离输入参量值 (
Distance
) 必须为编译时常量。例如,要使用闵可夫斯基距离,请将coder.Constant('Minkowski')
包含在codegen
的-args
值中。距离输入参量值 (
Distance
) 不能为自定义距离函数。pdist
不支持快速欧几里德距离计算的代码生成,即名称以fast
开头的那些距离度量(例如'fasteuclidean'
)。pdist
的生成代码使用parfor
(MATLAB Coder) 在生成的代码中创建可在受支持的共享内存多核平台上并行运行的循环。如果您的编译器不支持 Open Multiprocessing (OpenMP) 应用程序接口,或您禁用 OpenMP 库,则 MATLAB Coder™ 会将parfor
循环视为for
循环。要查找受支持的编译器,请参阅受支持的编译器。要禁用 OpenMP 库,请将配置对象的EnableOpenMP
属性设置为false
。有关详细信息,请参阅coder.CodeConfig
(MATLAB Coder)。
有关代码生成的详细信息,请参阅 Introduction to Code Generation 和 General Code Generation Workflow。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
用法说明和限制:
优化的 CUDA 代码支持的距离输入参量值 (
Distance
) 包括'euclidean'
、'squaredeuclidean'
、'seuclidean'
、'cityblock'
、'minkowski'
、'chebychev'
、'cosine'
、'correlation'
、'hamming'
和'jaccard'
。Distance
不能为自定义距离函数。Distance
必须为编译时常量。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
不能将
Distance
输入参量指定为"fasteuclidean"
、"fastsquaredeuclidean"
、"fastseuclidean"
或自定义距离函数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)