# pdist

## 语法

``D = pdist(X)``
``D = pdist(X,Distance)``
``D = pdist(X,Distance,DistParameter)``
``D = pdist(X,Distance,CacheSize=cache)``
``D = pdist(X,Distance,DistParameter,CacheSize=cache)``

## 说明

``D = pdist(X)` 返回 `X` 中成对观测值之间的欧几里德距离。 `

``D = pdist(X,Distance)` 使用 `Distance` 指定的方法返回距离。 `

``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'` 时，此参数才适用。`

## 示例

```rng('default') % For reproducibility X = rand(3,2);```

`D = pdist(X)`
```D = 1×3 0.2954 1.0670 0.9448 ```

`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);```

`D1 = pdist(X,'minkowski')`
```D1 = 1×3 0.2954 1.0670 0.9448 ```

`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 ```

```rng('default') % For reproducibility X = rand(3,2);```

`X(1,1) = NaN;`

`D1 = pdist(X)`
```D1 = 1×3 NaN NaN 0.9448 ```

```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); ```

`D2 = pdist(X,@naneucdist)`
```D2 = 1×3 0.3974 1.1538 0.9448 ```

```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 ```

```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 ```

## 输入参数

`'euclidean'`

`'squaredeuclidean'`

`'seuclidean'`

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

`'cityblock'`

`'minkowski'`

`'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,:)` 之间的距离。

• 如果 `Distance``'seuclidean'``DistParameter` 是对应于每个维度的缩放因子的向量，指定为正向量。默认值为 `std(X,'omitnan')`

• 如果 `Distance``'minkowski'``DistParameter` 是闵可夫斯基距离的指数，指定为正标量。默认值为 2。

• 如果 `Distance``'mahalanobis'``DistParameter` 是协方差矩阵，指定为数值矩阵。默认值为 `cov(X,'omitrows')``DistParameter` 必须是对称正定矩阵。

## 输出参量

`D` 通常在聚类或多维尺度分析中用作相异度矩阵。有关详细信息，请参阅Hierarchical Clustering以及 `cmdscale``cophenet``linkage``mdscale``optimalleaforder` 的函数参考页。这些函数接受 `D` 作为输入参量。

## 详细信息

### 距离度量

• 欧几里德距离

`${d}_{st}^{2}=\left({x}_{s}-{x}_{t}\right)\left({x}_{s}-{x}_{t}{\right)}^{\prime }.$`

欧几里德距离是闵可夫斯基距离的特例，其中 p = 2

• 标准化的欧几里德距离

`${d}_{st}^{2}=\left({x}_{s}-{x}_{t}\right){V}^{-1}\left({x}_{s}-{x}_{t}{\right)}^{\prime },$`

其中 V 是 n×n 对角矩阵，它的第 j 个对角线元素是 (S(j))2，其中 S 是对应于每个维度的缩放因子的向量。

• 马氏距离

`${d}_{st}^{2}=\left({x}_{s}-{x}_{t}\right){C}^{-1}\left({x}_{s}-{x}_{t}{\right)}^{\prime },$`

其中 C 是协方差矩阵。

• 城市街区距离

`${d}_{st}=\sum _{j=1}^{n}|{x}_{sj}-{x}_{tj}|.$`

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

• 闵可夫斯基距离

`${d}_{st}=\sqrt[p]{\sum _{j=1}^{n}{|{x}_{sj}-{x}_{tj}|}^{p}}.$`

对于特例 p = 1，闵可夫斯基距离即城市街区距离。对于特例 p = 2，闵可夫斯基距离即欧几里德距离。对于特例 p = ∞，闵可夫斯基距离即切比雪夫距离。

• 切比雪夫距离

`${d}_{st}={\mathrm{max}}_{j}\left\{|{x}_{sj}-{x}_{tj}|\right\}.$`

切比雪夫距离是闵可夫斯基距离的特例，其中 p = ∞

• 余弦距离

`${d}_{st}=1-\frac{{x}_{s}{{x}^{\prime }}_{t}}{\sqrt{\left({x}_{s}{{x}^{\prime }}_{s}\right)\left({x}_{t}{{x}^{\prime }}_{t}\right)}}.$`
• 相关性距离

`${d}_{st}=1-\frac{\left({x}_{s}-{\overline{x}}_{s}\right){\left({x}_{t}-{\overline{x}}_{t}\right)}^{\prime }}{\sqrt{\left({x}_{s}-{\overline{x}}_{s}\right){\left({x}_{s}-{\overline{x}}_{s}\right)}^{\prime }}\sqrt{\left({x}_{t}-{\overline{x}}_{t}\right){\left({x}_{t}-{\overline{x}}_{t}\right)}^{\prime }}},$`

其中

${\overline{x}}_{s}=\frac{1}{n}\sum _{j}{x}_{sj}$${\overline{x}}_{t}=\frac{1}{n}\sum _{j}{x}_{tj}$

• 汉明距离

`${d}_{st}=\left(#\left({x}_{sj}\ne {x}_{tj}\right)/n\right).$`
• 杰卡德距离

`${d}_{st}=\frac{#\left[\left({x}_{sj}\ne {x}_{tj}\right)\cap \left(\left({x}_{sj}\ne 0\right)\cup \left({x}_{tj}\ne 0\right)\right)\right]}{#\left[\left({x}_{sj}\ne 0\right)\cup \left({x}_{tj}\ne 0\right)\right]}.$`
• 斯皮尔曼 距离

`${d}_{st}=1-\frac{\left({r}_{s}-{\overline{r}}_{s}\right){\left({r}_{t}-{\overline{r}}_{t}\right)}^{\prime }}{\sqrt{\left({r}_{s}-{\overline{r}}_{s}\right){\left({r}_{s}-{\overline{r}}_{s}\right)}^{\prime }}\sqrt{\left({r}_{t}-{\overline{r}}_{t}\right){\left({r}_{t}-{\overline{r}}_{t}\right)}^{\prime }}},$`

其中

• rsj 是在 x1j、x2j、...xmj 上所取的 xsj 的秩，如 `tiedrank` 计算所得。

• rs 和 rt 是 xs 和 xt 的基于坐标轴的秩向量，即 rs = (rs1, rs2, ... rsn)。

• ${\overline{r}}_{s}=\frac{1}{n}\sum _{j}{r}_{sj}=\frac{\left(n+1\right)}{2}$.

• ${\overline{r}}_{t}=\frac{1}{n}\sum _{j}{r}_{tj}=\frac{\left(n+1\right)}{2}$.

## 算法

### 快速欧几里德距离算法

`fast` 开头的 `Distance` 参量（如 `'fasteuclidean'``'fastseuclidean'`）的值在计算欧几里德距离时使用的算法会使用额外的内存来节省计算时间。此算法在 Albanie 的文献 [1] 中和其他位置称为“欧几里德距离矩阵技巧”。内部测试表明，当预测变量的数目至少为 10 时，该算法可以节省时间。

`$\begin{array}{c}{D}_{i,j}^{2}=‖{x}_{i}-{x}_{j}{‖}^{2}\\ ={\left(}^{{x}_{i}}\left({x}_{i}-{x}_{j}\right)\\ =‖{x}_{i}{‖}^{2}-2{x}_{i}^{T}{x}_{j}+‖{x}_{j}{‖}^{2}.\end{array}$`

## 参考

[1] Albanie, Samuel. Euclidean Distance Matrix Trick. June, 2019. Available at https://www.robots.ox.ac.uk/%7Ealbanie/notes/Euclidean_distance_trick.pdf.