1、基本语法:
D = pdist2(X,Y,Distance,DistParameter)
D:使用 Distance
指定的度量返回 X
和 Y
中每对观测值之间的距离
X、Y:两个列数相同的矩阵,X(mxn)指的是X有m个观测值,n个变量(如果n是2,可以用x-y坐标轴里的点之间的距离来理解)
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 ...其中
对于非稀疏数据,使用内置距离度量计算距离通常比使用函数句柄更快。 |
-
D = pdist2(X,Y,Distance,'Smallest',K)
使用 Distance 指定的度量计算距离,并以升序返回X
中观测值与Y
中每个观测值的前K
个最小两两距离。 -
D = pdist2(X,Y,Distance,DistParameter,'Largest',K)
使用Distance
和 DistParameter 指定的度量计算距离,并以降序返回K
个最大的两两距离。
2、示例
rng('default') % For reproducibility
X = rand(3,2);
Y = rand(2,2);
%计算欧几里德距离
D = pdist2(X,Y)
%使用默认指数 2 计算闵可夫斯基距离
D1 = pdist2(X,Y,'minkowski')
%用指数 1 计算闵可夫斯基距离,它等于城市街区距离。
D2 = pdist2(X,Y,'minkowski',1)
%为 Y 中的每个观测值求出 X 中观测值的两个最小的两两欧几里德距离。
[D3,I] = pdist2(X,Y,'euclidean','Smallest',2)
3、计算原则
D里的每个元素是怎么计算出来的呢?以欧几里得距离为例
D=pdist2(X,X)里第s行、第t列的元素值,是根据上式计算的。
另外,D=pdist2(X,Y)里的第s行、第t列的元素值Dst,是通过X的第s行和Y的第t行代入上述公式计算的。
D的维度,是由X和Y确定的,若X共p行,Y共q行,则D=pdist2(X,Y)的维度为pxq;D=pdist2(Y,X)的维度为qxp。
可以用下面的代码来验证结果
X=[1 2;3 4;5 6];
Y=[10 11;12 13];
D=pdist2(X,Y)
req=X(1,:)-Y(1,:)
D11=(req*req')^(1/2)
req=X(1,:)-Y(2,:)
D12=(req*req')^(1/2)
req=X(3,:)-Y(2,:)
D23=(req*req')^(1/2)
4、使用 fasteuclidean
距离加速距离计算
%计算时间
rng default % For reproducibility
N = 10000;
X = randn(N,1000);
Y = randn(N,1000);
D = pdist2(X,Y); % Warm up function for more reliable timing information
tic
D = pdist2(X,Y);
standard = toc
%% 加速
D = pdist2(X,Y,"fasteuclidean",CacheSize=100); % Warm up function
tic
D2 = pdist2(X,Y,"fasteuclidean",CacheSize=100);
accelerated = toc
5、使用自定义距离函数计算涉及缺失元素的两两距离
定义一个忽略 NaN
值坐标的自定义距离函数,并使用该自定义距离函数计算两两距离。
假设缺少 X(1,1)
。
rng('default') % For reproducibility
X = rand(3,3)
Y = [X(:,1:2) rand(3,1)]
%假设缺少 X(1,1)。
X(1,1) = NaN
%计算汉明距离
D1 = pdist2(X,Y,'hamming')
输出:
D1 = NaN NaN NaN 1.0000 0.3333 1.0000 1.0000 1.0000 0.3333
如果 X
中的观测值 i
或 Y
中的观测值 j
包含 NaN
值,则对于 i
和 j
之间的两两距离,函数 pdist2
返回 NaN
。因此,D1(1,1)、D1(1,2) 和 D1(1,3) 为 NaN
值。
定义一个自定义距离函数 nanhamdist
,该函数忽略 NaN
值的坐标并计算汉明距离。当处理大量观测值时,您可以通过遍历数据的坐标来更快地计算距离。
function D2 = nanhamdist(XI,XJ)
%NANHAMDIST Hamming distance ignoring coordinates with NaNs
[m,p] = size(XJ);
nesum = zeros(m,1);
pstar = zeros(m,1);
for q = 1:p
notnan = ~(isnan(XI(q)) | isnan(XJ(:,q)));
nesum = nesum + ((XI(q) ~= XJ(:,q)) & notnan);
pstar = pstar + notnan;
end
D2 = nesum./pstar;
将函数句柄作为输入参量传递给 pdist2
,以使用 nanhamdist
计算该距离。
D2 = pdist2(X,Y,@nanhamdist)
距离公式:
参考:
官方文档:https://ww2.mathworks.cn/help/stats/pdist2.html#mw_0caf6303-9425-4d6c-89fa-2f2c766937ad
matlab中pdist2(X,X)函数以及pdist2(X,Y)函数的具体使用方法_pdist2函数matlab-CSDN博客