Bootstrap

matlab--pdist2(X,Y)使用方法、怎么计算的

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'

标准化的欧几里德距离。每个观测值间坐标差都通过除以标准差 S = std(X,'omitnan') 中的对应元素来缩放。使用 DistParameter 为 S 指定不同值。

'fasteuclidean'当预测变量的数目至少为 10 时,使用替代算法计算的欧几里德距离,该算法可以节省时间。在某些情况下,这种更快的算法会降低准确度。以 'fast' 开头的算法不支持稀疏数据。有关详细信息,请参阅 算法
'fastsquaredeuclidean'当预测变量的数目至少为 10 时,使用替代算法计算的平方欧几里德距离,该算法可以节省时间。在某些情况下,这种更快的算法会降低准确度。以 'fast' 开头的算法不支持稀疏数据。有关详细信息,请参阅 算法
'fastseuclidean'当预测变量的数目至少为 10 时,使用替代算法计算的标准化的欧几里德距离,该算法可以节省时间。在某些情况下,这种更快的算法会降低准确度。以 'fast' 开头的算法不支持稀疏数据。有关详细信息,请参阅 算法
'mahalanobis'

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

'cityblock'

城市街区距离

'minkowski'

闵可夫斯基距离。默认指数是 2。使用 DistParameter 指定其他指数 P,其中 P 是表示指数的正标量值。

'chebychev'

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

'cosine'

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

'correlation'

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

'hamming'

汉明距离,即相异坐标所占的百分比

'jaccard'

1 减去杰卡德系数,即非零相异坐标所占的百分比

'spearman'

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

@distfun

自定义距离函数句柄。距离函数的形式如下

function D2 = distfun(ZI,ZJ)
% calculation of distance
...
其中

  • ZI 是包含单个观测值的 1×n 向量。

  • ZJ 是包含多个观测值的 m2×n 矩阵。distfun 必须接受具有任意数目的观测值的矩阵 ZJ

  • D2 是距离的 m2×1 向量,D2(k) 是观测值 ZI 和 ZJ(k,:) 之间的距离。

对于非稀疏数据,使用内置距离度量计算距离通常比使用函数句柄更快。

  • 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博客

;