第 16 章 多元统计

CHAPTER STATUS编写进度80%查看全书进度

16.1 主成分分析

主成分分析(principal component analysis)的目的是:对数据进行一个线性变换,在最大程度保留原始信息的前提下进行数据的降维。反映在变量上就是说,对所有的变量进行一个线性变换,使得变换后得到的变量彼此之间不相关,并且是所有可能的线性变换中方差最大的一些变量(我们认为方差体现了信息量的大小)。

16.1.1 总体主成分分析

Definition 16.1. 设\(\mathbf{X}\)是一个\(n\)维随机向量,其均值向量为\(\mu=(\mu_1, \mu_2, \dots, \mu_{n})\)、协方差矩阵为\(\Sigma=(\sigma_{ij}),\;i,j=1,2,\dots,n\)。对\(\mathbf{X}\)进行一个线性变换\(\mathcal{T}\)得到一个\(n\)维随机向量\(\mathbf{Y}=(Y_1, Y_2, \dots, Y_{n})^{\top}\)\(\mathcal{T}\)的矩阵为\(A=(\alpha_1^{\top};\alpha_2^{\top};\cdots;\alpha_n^{\top})\)。若:

  1. \(AA^{\top}=I_n\)

  2. \(\operatorname{Cov}(\mathbf{Y})\)是一个对角矩阵,即\(\operatorname{Cov}(Y_i,Y_j)=0,\;i\ne j\)

  3. \(Y_1\)是所有对\(\mathbf{X}\)进行线性变换后得到的随机变量中方差最大的随机变量,\(Y_2\)是与\(Y_1\)不相关的所有对\(\mathbf{X}\)进行线性变换后得到的随机变量中方差第二大的随机变量,以此类推。

则分别称\(Y_1, Y_2, \dots, Y_{n}\)是第一、第二、……、第\(n\)主成分。

Theorem 16.1. 若不对\(\mathcal{T}\)的矩阵\(A\)作出相应的限制,即去除\(AA^{\top}=I_n\)的限制,对\(\mathbf{X}\)进行线性变换后得到的\(Y_i,\;i=1,2,\dots,n\)的方差可以任意大。

证明. 性质 6.3.4(3)可知:

\[\begin{equation*} \operatorname{Var}(Y_i)=\operatorname{Cov}(\mathbf{Y})(i,i)=\operatorname{Cov}(A\mathbf{X})(i,i)=(A\Sigma A^{\top})(i,i)=\alpha_i^{\top}\Sigma\alpha_i \end{equation*}\]

\(\operatorname{Var}(Y_i)>0\),取矩阵\(B=kA\)\(\mathbf{Z}=kA\mathbf{X}\),则:

\[\begin{equation*} \operatorname{Var}(Z_i)=(k\alpha_i)^{\top}\Sigma(k\alpha_i)=k^2\alpha_i^{\top}\Sigma\alpha_i \end{equation*}\]

即改变\(k\)的值就可对\(Y_i,\;i=1,2,\dots,n\)的方差进行任意的放缩。 ◻

Theorem 16.2. 设\(\mathbf{X}\)是一个\(n\)维随机向量,\(\Sigma\)是其协方差矩阵,\(\Sigma\)的特征值1从大到小记作\(\lambda_1, \lambda_2, \dots, \lambda_{n}\)\(\varphi_1, \varphi_2, \dots, \varphi_{n}\)为对应的标准正交化特征向量,则\(\mathbf{X}\)的第\(i\)个主成分以及其方差为:

\[\begin{equation*} Y_i=\varphi_i^{\top}\mathbf{X},\;\operatorname{Var}(Y_i)=\varphi_i^{\top}\Sigma\varphi_i=\lambda_i \end{equation*}\]

证明. 考虑到:

\[\begin{equation*} \operatorname{Var}(Y_i)=\alpha_i^{\top}\Sigma\alpha_i,\quad \operatorname{Cov}(Y_i,Y_j)=\alpha_i^{\top}\Sigma\alpha_j \end{equation*}\]

求解主成分的过程即为求解:

\[\begin{gather*} \alpha_i=\arg\max\alpha_i^{\top}\Sigma\alpha_i,\quad \operatorname{s.t.} \begin{cases} ||\alpha_i||=1,\;&i=1,2,\dots,n\\ \alpha_i^{\top}\Sigma\alpha_j=0,\;&j<i \end{cases} \end{gather*}\]

定理 2.16可知上述结论成立。 ◻

Definition 16.2. 将第\(i\)个主成分\(Y_i\)与变量\(X_j\)的相关系数\(\rho(Y_i,X_j)\)称为因子负荷量(factor loading)

Definition 16.3. 称主成分\(Y_1, Y_2, \dots, Y_{k}\)与变量\(X_j\)之间的复相关系数的平方\(R^2\)\(Y_1, Y_2, \dots, Y_{k}\)\(X_j\)的贡献率。

Property 16.1.1. 总体主成分具有如下性质:

  1. \(\operatorname{Cov}(\mathbf{Y})=\operatorname{diag}\{\lambda_1, \lambda_2, \dots, \lambda_{n}\}\)

  2. \(\mathbf{Y}\)的方差之和等于\(\mathbf{X}\)的方差之和,即\(\sum\limits_{i=1}^{n}\lambda_i=\sum\limits_{i=1}^{n}\sigma_{ii}\)

  3. \(\rho(Y_i,X_j)=\dfrac{\sqrt{\lambda_i}\alpha_{ij}}{\sqrt{\sigma_{jj}}},\;i,j=1,2,\dots,n\)

  4. \(i\)个主成分与原变量的因子负荷量满足\(\sum\limits_{j=1}^{n}\sigma_{jj}\rho^2(Y_i,X_j)=\lambda_i\)

  5. 原变量的第\(j\)个分量与所有主成分的因子负荷量满足\(\sum\limits_{i=1}^{n}\rho^2(Y_i,X_j)=1\)

  6. \(\Sigma>\mathbf{0}\),则原变量的第\(j\)个分量与前\(k\)个主成分之间的复相关系数满足:

    \[\begin{equation*} R^2=\sum_{i=1}^{k}\rho^2(Y_i,X_j)=\sum_{i=1}^{k}\frac{\lambda_i\alpha_{ij}^2}{\sigma_{ii}} \end{equation*}\]

证明. (1)由定理 16.2直接可得。

(2)由性质 6.3.4(3)性质 2.1.5(3)可得:

\[\begin{align*} \sum_{i=1}^{n}\operatorname{Var}(Y_i) &=\operatorname{tr}[\operatorname{Cov}(\mathbf{Y})]=\operatorname{tr}[\operatorname{Cov}(A\mathbf{X})]=\operatorname{tr}(A\Sigma A^{\top}) \\ &=\operatorname{tr}(\Sigma A^{\top}A)=\operatorname{tr}(\Sigma)=\sum_{i=1}^{n}\operatorname{Var}(X_i) \end{align*}\]

(3)由性质 6.3.4(3)可得:

\[\begin{align*} \rho(Y_i,X_j) &=\frac{\operatorname{Cov}(Y_i,X_j)}{\sqrt{\operatorname{Var}(Y_i)\operatorname{Var}(X_j)}}=\frac{\operatorname{Cov}(\alpha_i^{\top}\mathbf{X},e_j^{\top}\mathbf{X})}{\sqrt{\lambda_i\sigma_{jj}}} \\ &=\frac{\alpha_i^{\top}\Sigma e_j}{\sqrt{\lambda_i\sigma_{jj}}}=\frac{e_j^{\top}\Sigma\alpha_i}{\sqrt{\lambda_i\sigma_{jj}}}=\frac{e_j^{\top}\lambda_i\alpha_i}{\sqrt{\lambda_i\sigma_{jj}}}=\frac{\sqrt{\lambda_i}\alpha_{ij}}{\sqrt{\sigma_{jj}}} \end{align*}\]

(4)由(3)可得:

\[\begin{equation*} \sum_{j=1}^{n}\sigma_{jj}\rho^2(Y_i,X_j)=\sum_{j=1}^{n}\lambda_i\alpha_{ij}^2=\lambda_i\alpha_i^{\top}\alpha_i=\lambda_i \end{equation*}\]

(5)由性质 6.3.8(3)性质 6.3.7(1)立即可得。

(6)当\(\Sigma>\mathbf{0}\)时,由定理 2.17(3.5)可知\(\Sigma\)的特征值都大于\(0\),根据定理 16.2\(\operatorname{Var}(Y_i)>0\),于是由性质 6.3.8(1)和(3)可立即得出结论。 ◻

Definition 16.4. 称第\(i\)个主成分\(Y_i\)的方差与所有主成分方差之和的比值为\(Y_i\)的方差贡献率,记为\(\eta_i\),即\(\eta_i=\lambda_i\Big/\sum\limits_{j=1}^{n}\lambda_j\)。将\(\sum\limits_{i=1}^{k}\lambda_i\Big/\sum\limits_{i=1}^{n}\lambda_i\)称为主成分\(Y_1, Y_2, \dots, Y_{k}\)的累计方差贡献率。

由前述,我们一般通过选择主成分的个数来实现对数据的降维,即选择主成分的个数使它们的累计方差贡献率达到一定比例(一般为\(85\%\))。

16.1.2 样本主成分分析

假设对\(n\)维随机变量\(\mathbf{X}\)进行\(m\)次独立观测,得到\(m\)\(n\)维样本\(x_1, x_2, \dots, x_{m}\)。在样本主成分分析中,我们使用样本来估计\(\mathbf{X}\)的协方差矩阵,即:

\[\begin{equation*} \hat{\boldsymbol{\mu}}=\frac{1}{m}\sum_{i=1}^{m}x_i,\;S=(s_{ij})=\frac{1}{m-1}\sum_{i=1}^{m}(x_i-\hat{\boldsymbol{\mu}})(x_i-\hat{\boldsymbol{\mu}})^{\top},\;i,j=1,2,\dots,n \end{equation*}\]

其余步骤与总体主成分分析一致。

16.1.3 注意事项

16.1.3.1 多重共线性问题

当原始变量出现多重共线性时,重复的信息在方差占比中会重复进行计算,导致方差占比被改变。为了达到一定的累积贡献率,就会不可避免地使得主成分也融入重复信息(可以从一个极端案例来想:添加一个重复变量到原先一点都不重复的观测样本集中),所以主成分是无法解决重复信息问题的。主成分分析从另一个角度是依赖于多重共线性的:我们需要舍弃方差贡献率小的主成分。如果没有方差贡献率较小的主成分,这说明原数据几乎没有多重共线性情况,此时无论舍弃哪个主成分都将导致严重的信息损失。

16.1.3.2 相关矩阵导出主成分

上面我们都是对协方差矩阵的特征值分解进行计算,但在现实中,各变量的量纲可能不一样,这就导致各变量方差的量级会不一样,方差越大,由性质 16.1.1(2)可知必然会导致该变量在主成分构成中的占比变大,但此时的大方差可能仅仅是因为量纲的不同,从变异系数的角度可能各变量的波动差距没有那么明显。为了消除量纲带来的影响,我们会对数据进行标准化,注意到标准化后数据的协方差矩阵即为相关矩阵,此时将相关矩阵作对应的特征值分解即可。但需要注意:标准化后各变量方差相等均为\(1\),损失了部分信息,所以会使得标准化后的各变量在对主成分构成中的作用趋于相等。因此,取值范围在同量级的数据建议使用协方差矩阵直接求解主成分,若变量之间数量级差异较大,再使用相关矩阵求解主成分。

算法 16.1 主成分分析(PCA)

Input: 原始数据矩阵 \(\mathbf{X}\)

Output: 主成分得分 \(\mathbf{Y}\),选定的主成分个数 \(k\)

if 变量量纲差异明显 then

\(\mathbf{X}\)标准化得到\(\mathbf{Z}\)

else

保留原始数据 \(\mathbf{Z} = \mathbf{X}\)

end if

if 存在多重共线性(最小特征值 \(\approx 0\)then

删除或合并相关变量

else

保留原始变量

end if

计算协方差矩阵:\(\Sigma = \text{cov}(\mathbf{Z})\),对 \(\Sigma\) 进行特征值分解:\(\Sigma = A \Lambda A^{\top}\)

初始化 \(k \gets 1\), 累计贡献率 \(\gets 0\)

repeat

选择第 \(k\) 个主成分,更新累计贡献率

if 累计贡献率 \(<\) 阈值 then

\(k \gets k + 1\)

end if

until 累计贡献率 \(\geqslant\) 阈值

计算主成分得分:\(\mathbf{Y}=A_k\mathbf{Z}\)\(A_k\)为矩阵\(A\)的前\(k\)行构成的矩阵),输出 \(\mathbf{Y}\)\(k\)

16.1.4 应用:主成分回归

note 16.1. 我们将介绍PCA在解决线性模型复共线性问题上的应用,接下来将延续在岭估计处提到的线性回归模型的典则形式,并将\(\operatorname{diag}\{\lambda_1, \lambda_2, \dots, \lambda_{p-1}\}\)设置为\(\lambda_1>\lambda_2>\cdots>\lambda_{p-1}\)的形式。由矩阵多项式的特征向量可知\(Y\)实际上是经过PCA处理后的数据,当\(X^{\top}X\)存在很小的特征值时,不妨设它们为\(\lambda_{r+1},\lambda_{r+2},\dots,\lambda_{p-1}\),由性质 16.1.1(1)可知\(Y_{r+1},Y_{r+2},\dots,Y_{p-1}\)的方差很小,于是我们可以舍弃它们,从而得到如下模型:

\[\begin{equation*} y=\alpha_0\mathbf{1}_n+\mathbf{Y}_1\delta_1+\varepsilon,\quad\operatorname{E}(\varepsilon)=\mathbf{0},\quad\operatorname{Cov}(\varepsilon)=\sigma^2I_n \end{equation*}\]

其中\(\mathbf{Y}_1\)\(Y\)的前\(r\)列,\(\delta_1\)\(\delta_I\)的前\(r\)行。称如上模型给出的估计\(\hat{\delta}_I=(\hat{\delta}_1,\mathbf{0})^{\top}\)\(\hat{\delta}\)主成分估计(principal component estimate)

Property 16.1.2. 中心化模型的主成分回归具有如下性质:

  1. \(\hat{\alpha}_0=\overline{y},\;\hat{\delta}_1=(\mathbf{Y}_1^{\top}\mathbf{Y}_1)^{-1}\mathbf{Y}_1^{\top}y=\operatorname{diag}\left\{\dfrac{1}{\lambda_{1}},\dfrac{1}{\lambda_{2}},\dots,\dfrac{1}{\lambda_{r}}\right\}\mathbf{Y}_1^{\top}y=\operatorname{diag}\left\{\dfrac{1}{\lambda_{1}},\dfrac{1}{\lambda_{2}},\dots,\dfrac{1}{\lambda_{r}}\right\}Q_1\tilde{X}_c^{\top}y,\hat{\alpha}_I=Q_1^{\top}\operatorname{diag}\left\{\dfrac{1}{\lambda_{1}},\dfrac{1}{\lambda_{2}},\dots,\dfrac{1}{\lambda_{r}}\right\}\mathbf{Y}_1^{\top}y=Q_1^{\top}\operatorname{diag}\left\{\dfrac{1}{\lambda_{1}},\dfrac{1}{\lambda_{2}},\dots,\dfrac{1}{\lambda_{r}}\right\}Q\tilde{X}_c^{\top}y\),其中\(Q_1\)\(Q\)的前\(r\)行;

  2. 主成分估计一般是有偏估计;

  3. 当原中心化设计阵存在复共线性关系时,适当选择保留的主成分个数可以使得主成分估计比LSE具有更小的\(\operatorname{MSE}\)

证明. (1)显然\(\mathbf{Y}_1\)也是中心化的,所以第一式成立。由性质 2.1.11(1)性质 2.1.10(16)可知\(Y\)是列满秩的,所以由性质 1.1.2(1)可得\(\mathbf{Y}_1\)是列满秩的,根据定理 15.12(1)可得\((\mathbf{Y}_1^{\top}\mathbf{Y}_1)^{-1}\)存在。由正则方程即可得\(\hat{\delta}_1=(\mathbf{Y}_1^{\top}\mathbf{Y}_1)^{-1}\mathbf{Y}_1^{\top}y\)。根据性质 2.1.2(4)可知:

\[\begin{equation*} \mathbf{Y}_1^{\top}\mathbf{Y}_1=Q_1\tilde{X}_c^{\top}\tilde{X}_cQ_1^{\top}=\operatorname{diag}\{\lambda_1, \lambda_2, \dots, \lambda_{r}\} \end{equation*}\]

其中\(Q_1\)\(Q\)的前\(r\)行,于是有:

\[\begin{equation*} \hat{\delta}_1=(\mathbf{Y}_1^{\top}\mathbf{Y}_1)^{-1}\mathbf{Y}_1^{\top}y=\operatorname{diag}\left\{\dfrac{1}{\lambda_{1}},\dfrac{1}{\lambda_{2}},\dots,\dfrac{1}{\lambda_{r}}\right\}\mathbf{Y}_1^{\top}y=\operatorname{diag}\left\{\dfrac{1}{\lambda_{1}},\dfrac{1}{\lambda_{2}},\dots,\dfrac{1}{\lambda_{r}}\right\}Q_1\tilde{X}_c^{\top}y \end{equation*}\]

性质 2.1.2(4)性质 2.1.10(11)定理 15.12(3)可得:

\[\begin{equation*} \hat{\alpha}_I=(\tilde{X}_c^{\top}\tilde{X}_c)^{-1}\tilde{X}_c^{\top}y=Q^{\top}\operatorname{diag}\left\{\dfrac{1}{\lambda_{1}},\dfrac{1}{\lambda_{2}},\dots,\dfrac{1}{\lambda_{p-1}}\right\}Q\tilde{X}_c^{\top}y \end{equation*}\]

16.2 因子分析

因子分析(factor analysis)的目的是从多个高度相关的观测变量中提取出少数几个潜在因子(latent factor),这些因子代表了变量背后的共通结构,从而实现降维并提升可解释性。

假设对一组学生进行了以下六门课程的测试:语文、英语、数学、物理、化学、生物,发现语文和英语成绩之间高度相关,数学、物理、化学、生物也彼此高度相关。此时可以猜测:这些成绩可能是由两个更基本的”能力”决定的,比如语言能力和理科能力。通过因子分析就可以提取出这两个潜在因子,并发现语文和英语主要由”语言能力”因子决定,理科四门主要由”理科能力”因子解释。这样就可以用两个因子有效地概括了六个变量的结构,同时让模型更易解释、更简洁。

Definition 16.5. 设\(\mathbf{X}\)是一个可观测的\(m\)维随机向量,\(\operatorname{E}(\mathbf{X})=\boldsymbol{\mu},\;\operatorname{Cov}(\mathbf{X})=\Sigma=(\sigma_{ij})\)。因子分析的数学模型为:

\[\begin{gather*} \mathbf{X}=\boldsymbol{\mu}+AF+\varepsilon \\ \begin{cases} \operatorname{E}(F)=\mathbf{0},\;\operatorname{Cov}(F)=I_n \\ \operatorname{E}(\varepsilon)=\mathbf{0},\;\operatorname{Cov}(\varepsilon)=D=\operatorname{diag}\{\sigma^2_1, \sigma^2_2, \dots, \sigma^2_{m}\} \\ \operatorname{Cov}(F,\varepsilon)=\mathbf{0} \end{cases} \end{gather*}\]

其中\(F=(f_1, f_2, \dots, f_{n})^{\top}\)是不可观测的\(n\)维随机向量,\(\varepsilon\)是不可观测的\(m\)维随机向量,分别称\(F\)\(\varepsilon\)公共因子(common factor)特殊因子(specific factor)\(A=(a_{ij})\)是一个非随机矩阵,\(a_{ij}\)表示公共因子\(f_j\)、随机变量\(\mathbf{X}_i\)的因子载荷。\(a_{1j},a_{2j},\dots,a_{ij}\)中至少有两个不为\(0\),否则可将\(f_i\)并入到\(\varepsilon_i\)中去;\(\varepsilon_i\)也仅出现在\(\mathbf{X}_i\)的表达式中。

Property 16.2.1. 上述因子分析模型具有如下性质:

  1. \(\Sigma=AA^{\top}+D\)

  2. 模型不受单位影响。若\(\mathbf{X}^{\star}=C\mathbf{X}\)\(C\)是一个对角矩阵,则有:

    \[\begin{equation*} \mathbf{X}^{\star}=C\boldsymbol{\mu}+CAF+C\varepsilon=\boldsymbol{\mu}^{\star}+A^{\star}F+\varepsilon^{\star} \end{equation*}\]

    依旧满足因子分析模型;

  3. 因子载荷不唯一;

  4. \(\operatorname{Cov}(\mathbf{X},F)=A\),即\(\operatorname{Cov}(\mathbf{X}_i,F_j)=a_{ij}\)

  5. \(h_i^2=\sum\limits_{j=1}^{n}a_{ij}^2\),则有:

    \[\begin{equation*} \operatorname{Var}(\mathbf{X}_i)=\sigma_{ii}=\sum_{j=1}^{n}a_{ij}^2+\sigma_i^2=h_i^2+\sigma_i^2,\;i=1,2,\dots,m \end{equation*}\]

  6. \(g_j^2=\sum\limits_{i=1}^{m}a_{ij}^2\),则有:

    \[\begin{equation*} \sum_{i=1}^{m}\operatorname{Var}(\mathbf{X}_i)=\sum_{j=1}^{n}g_j^2+\sum_{i=1}^{n}\sigma_i^2 \end{equation*}\]

证明. (1)由性质 6.3.4(3)(4)(5)可得:

\[\begin{align*} \Sigma&=\operatorname{Cov}(\mathbf{X})=\operatorname{Cov}(\boldsymbol{\mu}+AF+\varepsilon,\boldsymbol{\mu}+AF+\varepsilon) \\ &=\operatorname{Cov}(\boldsymbol{\mu},\boldsymbol{\mu}+AF+\varepsilon)+\operatorname{Cov}(AF,\boldsymbol{\mu}+AF+\varepsilon)+\operatorname{Cov}(\varepsilon,\boldsymbol{\mu}+AF+\varepsilon) \\ &=\operatorname{Cov}(AF,\boldsymbol{\mu})+\operatorname{Cov}(AF)+\operatorname{Cov}(AF,\varepsilon)+\operatorname{Cov}(\mathbf{\varepsilon},\boldsymbol{\mu})+\operatorname{Cov}(\varepsilon,AF)+\operatorname{Cov}(\varepsilon) \\ &=A\operatorname{Cov}(F)A^{\top}+A\operatorname{Cov}(F,\varepsilon)+\operatorname{Cov}(\varepsilon,F)A^{\top}+D \\ &=AA^{\top}+D \end{align*}\]

(2)显然。

(3)取正交矩阵\(Q\),令\(A^{\star}=AQ\)\(F^{\star}=Q^{\top}F\),由期望的性质性质 6.3.4(3)则依然有:

\[\begin{equation*} \operatorname{E}(F^{\star})=Q^{\top}\operatorname{E}(F)=\mathbf{0},\;\operatorname{Cov}(F^{\star})=Q^{\top}\operatorname{Cov}(F)Q=I_n,\;\mathbf{X}=\boldsymbol{\mu}+A^{\star}F^{\star}+\varepsilon \end{equation*}\]

(4)由性质 6.3.4(3)(4)(5)可得:

\[\begin{equation*} \operatorname{Cov}(\mathbf{X},F)=\operatorname{Cov}(\boldsymbol{\mu}+AF+\varepsilon,F)=\operatorname{Cov}(\boldsymbol{\mu},F)+\operatorname{Cov}(AF,F)+\operatorname{Cov}(\varepsilon,F)=A \end{equation*}\]

(5)由(1)即可得到结论。

(6)由性质 6.3.4(1)、(1)和性质 2.1.5(1)可得:

\[\begin{align*} \sum_{i=1}^{m}\operatorname{Var}(\mathbf{X}_i)&=\operatorname{tr}[\operatorname{Cov}(\mathbf{X})]=\operatorname{tr}(AA^{\top}+D)=\sum_{i=1}^{m}\sum_{j=1}^{n}a_{ij}^2+\sum_{i=1}^{n}\sigma_i^2 \\ &=\sum_{j=1}^{n}\sum_{i=1}^{m}a_{ij}^2+\sum_{i=1}^{n}\sigma_i^2=\sum_{j=1}^{n}g_j^2+\sum_{i=1}^{n}\sigma_i^2 \end{align*}\]

Definition 16.6. 称\(h_i^2\)为变量\(\mathbf{X}_i\)公共方差(common variance),它反映了公共因子对\(\mathbf{X}_i\)的方差贡献度。称\(\sigma_i^2\)\(\mathbf{X}_i\)特殊方差(specific variance),它反映了特殊因子\(\varepsilon_i\)\(\mathbf{X}_i\)的方差贡献度。\(g_j^2\)可视为公共因子\(f_j\)\(\mathbf{X}_1, \mathbf{X}_2, \dots, \mathbf{X}_{m}\)的总方差贡献度。

16.2.1 参数估计方法

16.2.1.1 主成分法

Method 16.1. 设观测变量\(\mathbf{X}\)的协方差矩阵\(\Sigma\),它的特征值从大到小依次为\(\lambda_1, \lambda_2, \dots, \lambda_{m}\),对应的单位正交特征向量分别为\(l_1, l_2, \dots, l_{m}\)。于是\(\Sigma\)有分解式:

\[\begin{equation*} \Sigma= \begin{pmatrix} l_1 & l_2 & \cdots &l_m \end{pmatrix} \begin{pmatrix} \lambda_1 & 0 & \cdots & 0 \\ 0 & \lambda_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \lambda_m \end{pmatrix} \begin{pmatrix} l_1^{\top} \\ l_2^{\top} \\ \vdots \\ l_m^{\top} \end{pmatrix} =\sum_{i=1}^{m}\lambda_il_il_i^{\top} \end{equation*}\]

性质 6.3.4(2)定理 2.18(3.5)可知\(\lambda_m\geqslant0\)。当最后\(m-n\)个特征值较小时,\(\Sigma\)有如下近似:

\[\begin{equation*} \Sigma=\sum_{i=1}^{m}\lambda_il_il_i^{\top}\approx\sum_{i=1}^{n}\lambda_il_il_i^{\top}+\hat{D}=\hat{A}\hat{A}^{\top}+\hat{D} \end{equation*}\]

其中:

\[\begin{equation*} \hat{A}= \begin{pmatrix} \sqrt{\lambda_1}l_1 & \cdots & \sqrt{\lambda_n}l_n \end{pmatrix},\; \hat{D}=\operatorname{diag}(\Sigma-\hat{A}\hat{A}^{\top}) \end{equation*}\]

与PCA一样,一般通过使\(\left(\sum\limits_{i=1}^{n}\lambda_i\right)\Big/\left(\sum\limits_{i=1}^{m}\lambda_i\right)\)大于一定比例来选择\(n\)的具体值。

16.2.1.2 主因子法

Method 16.2. 令\(AA^{\top}=\Sigma-D\)。取\(\hat{\sigma}^2_1, \hat{\sigma}^2_2, \dots, \hat{\sigma}^2_{m}\)为特殊方差的合理初始估计((1)全零,(2)取\(\max\limits_{j\ne i}\sigma_{ij}\)),则有:

\[\begin{equation*} \widehat{AA^{\top}}= \begin{pmatrix} \sigma_{11}-\hat{\sigma}_1^2 & \sigma_{12} & \cdots & \sigma_{1m} \\ \sigma_{21} & \sigma_{22}-\hat{\sigma}_2^2 & \cdots & \sigma_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{m1} & \sigma_{m2} & \cdots & \sigma_{mm}-\hat{\sigma}_m^2 \end{pmatrix} \end{equation*}\]

\(\widehat{AA^{\top}}\)\(n\)个大于\(0\)的特征值,从大到小依次为\(\hat{\lambda}_1, \hat{\lambda}_2, \dots, \hat{\lambda}_{n}\),对应的单位正交特征向量为\(\hat{l}_1, \hat{l}_2, \dots, \hat{l}_{n}\),则有近似的:

\[\begin{equation*} \hat{A}= \begin{pmatrix} \sqrt{\hat{\lambda}_1}\hat{l}_1 & \cdots & \sqrt{\hat{\lambda}_n}\hat{l}_n \end{pmatrix} \end{equation*}\]

\(\hat{\sigma}_i^2=\sigma_{ii}-\hat{h}_i^2\),继续上面的迭代过程以得到稳定的近似解。

算法 16.2 主因子法求解因子分析

Input: 协方差矩阵 \(\Sigma\),初始特殊方差估计 \(\hat{\sigma}^2_1, \ldots, \hat{\sigma}^2_m\),目标因子数 \(n\)

Output: 因子载荷矩阵估计 \(\hat{A}\),特殊方差估计 \(\hat{\sigma}_i^2\)

初始化 \(\hat{\sigma}_i^2\) 为合理值

repeat

构造矩阵 \(\widehat{AA^{\top}} = \Sigma - \operatorname{diag}(\hat{\sigma}_1^2, \ldots, \hat{\sigma}_m^2)\)

\(\widehat{AA^{\top}}\) 做特征值分解,得到部分特征值 \(\hat{\lambda}_1 \geqslant \cdots \geqslant \hat{\lambda}_n\),及对应单位正交特征向量 \(\hat{l}_1, \ldots, \hat{l}_n\)

构造因子载荷矩阵估计: \(\hat{A}=(\hat{a}_{ij}) = \begin{pmatrix} \sqrt{\hat{\lambda}_1} \hat{l}_1 & \cdots & \sqrt{\hat{\lambda}_n} \hat{l}_n \end{pmatrix}\)

\(\hat{h}_i^2 = \sum\limits_{j=1}^n \hat{a}_{ij}^2\),更新 \(\hat{\sigma}_i^2 = \sigma_{ii} - \hat{h}_i^2,\;i=1,2,\dots,m\)

until 特殊方差估计 \(\hat{\sigma}_i^2\) 收敛或达到最大迭代次数

16.2.1.3 正态分布假设下的极大似然估计法

Derivation 16.1. 若假设\(F\sim N_n(\mathbf{0},I_n),\;\varepsilon\sim N_m(\mathbf{0},D)\),因为\(F\)\(\varepsilon\)不相关,由性质 6.4.6(8)可知\(F\)\(\varepsilon\)独立。由定理 6.13性质 6.4.6(7)可得\(\mathbf{X}\sim N_m(\boldsymbol{\mu},AA^{\top}+D)\)。对\(\mathbf{X}\)进行简单抽样获得\(s\)个样本,由性质 6.4.6(7)性质 6.4.6(2)可得这\(s\)个样本的均值\(\bar{\mathbf{X}}\sim N_n\left(\boldsymbol{\mu},\dfrac{1}{s}(AA^{\top}+D)\right)\)。若样本均值为\(\bar{x}\),则似然函数为:

\[\begin{equation*} L(A,D)=(2\pi)^{-\frac{m}{2}}|\det[\frac{1}{s}(AA^{\top}+D)]|^{-\frac{1}{2}}\exp\left\{-\frac{1}{2}(\bar{x}-\boldsymbol{\mu})^{\top}\left[\frac{1}{s}(AA^{\top}+D)\right]^{-1}(\bar{x}-\boldsymbol{\mu})\right\} \end{equation*}\]

对数似然函数省去常数项即为:

\[\begin{align*} \ln L(A,D)&=-\frac{1}{2}\ln\left\{\left|\det\left[\frac{1}{s}(AA^{\top}+D)\right]\right|\right\}-\frac{1}{2}(\bar{x}-\boldsymbol{\mu})^{\top}\left[\frac{1}{s}(AA^{\top}+D)\right]^{-1}(\bar{x}-\boldsymbol{\mu}) \\ &=-\frac{1}{2}\ln\left\{\frac{1}{s^m}\left|\det(AA^{\top}+D)\right|\right\}-\frac{s}{2}(\bar{x}-\boldsymbol{\mu})^{\top}(AA^{\top}+D)^{-1}(\bar{x}-\boldsymbol{\mu}) \end{align*}\]

16.2.2 因子旋转

为了提高因子的可解释性,我们希望每个因子对观测变量的影响是集中且明显的,即一个因子主要对少数几个变量有显著影响,对其余变量几乎没有作用。这种结构反映在因子载荷矩阵\(A\)上即为\(A\)每一列的元素\(a_{ij},\;i=1,2,\dots,m\)不是均匀地分布在中间水平,而是趋于两极分化:其绝对值要么接近于\(0\),要么较大。这样可以使得每个因子更容易被识别和解释——因为它只与一小组变量高度相关。这种结构等价于希望载荷矩阵\(A\)的每一列具有稀疏性,从而便于赋予因子明确的语义标签。

Derivation 16.2. 由性质 16.2.1(3)可知在初步求得因子载荷矩阵\(A\)后,可以使用一个正交矩阵右乘\(A\),此时仍能得到一个因子模型。使用正交矩阵来右乘\(A\)相当于是对因子\(F\)进行旋转变换,我们可以通过不断旋转\(F\)来得到更加稀疏的因子载荷矩阵,从而提高因子的可解释性。

如何旋转?怎么衡量旋转后因子载荷矩阵的优良性?

令:

\[\begin{equation*} d_{ij}^2=\frac{a_{ij}^2}{h_i^2},\quad i=1,2,\dots,m,\;j=1,2,\dots,n \end{equation*}\]

\(d_{ij}^2\)衡量了因子\(j\)对观测变量\(\mathbf{X}_i\)的影响,且消除了\(a_{ij}\)的正负号带来的差异和各观测变量在因子载荷大小上的不同带来的差异。定义第\(j\)\(p\)个数据\(d_{ij}^2,\;i=1,2,\dots,m\)的方差为:

\[\begin{align*} V_j&=\frac{1}{m}\sum_{i=1}^{m}(d_{ij}^2-\bar{d}_j)^2=\frac{1}{m}\sum_{i=1}^{m}\left(d_{ij}^2-\frac{1}{m}\sum_{i=1}^{m}d_{ij}^2\right)^2 \\ &=\frac{1}{m}\left[\sum_{i=1}^{m}d_{ij}^4-2d_{ij}^2\frac{1}{m}\sum_{i=1}^{m}d_{ij}^2+\frac{1}{m^2}\left(\sum_{i=1}^{m}d_{ij}^2\right)^2\right] \\ &=\frac{1}{m}\left[\sum_{i=1}^{m}d_{ij}^4-d_{ij}^2\frac{2}{m}\sum_{i=1}^{m}d_{ij}^2+\frac{1}{m^2}\left(\sum_{i=1}^{m}d_{ij}^2\right)^2\right] \\ &=\frac{1}{m}\left[\sum_{i=1}^{m}d_{ij}^4-m\frac{1}{m^2}\left(\sum_{i=1}^{m}d_{ij}^2\right)^2\right] \\ &=\frac{1}{m^2}\left[m\sum_{i=1}^{m}d_{ij}^4-\frac{1}{m}\left(\sum_{i=1}^{m}d_{ij}^2\right)^2\right] \\ &=\frac{1}{m^2}\left[m\sum_{i=1}^{m}\frac{a_{ij}^4}{h_i^4}-\frac{1}{m}\left(\sum_{i=1}^{m}\frac{a_{ij}^2}{h_i^2}\right)^2\right] \end{align*}\]

\(V_j\)越大,则第\(j\)个因子对观测变量的影响越集中。定义因子载荷矩阵\(A\)的方差为:

\[\begin{equation*} V=\sum_{j=1}^{n}V_j=\frac{1}{m^2}\left\{\sum_{j=1}^{n}\left[m\sum_{i=1}^{m}\frac{a_{ij}^4}{h_i^4}-\frac{1}{m}\left(\sum_{i=1}^{m}\frac{a_{ij}^2}{h_i^2}\right)^2\right]\right\} \end{equation*}\]

\(V\)越大,则表明因子对观测变量的影响越集中。

综上,我们只需使得旋转后得到的因子载荷矩阵\(A\)的方差\(V\)达到最大即可。

16.2.3 模型检验

由上面的讨论可以看出,潜在因子的数目是一个超参数,也是一个非常重要的参数,我们该如何选择呢?有没有什么办法能够确定这一超参数的值?

Derivation 16.3. 在正态性假设下(仍需假设\(\mathbf{X}\)\(n\)维正态随机向量),我们可以对求解后的因子分析模型进行似然比检验。

设样本数为\(p\),分别为\(\mathbf{X_1},\mathbf{X_2},\dots,\mathbf{X_p}\),都独立同分布于\(\operatorname{N}_m(\boldsymbol{\mu},\Sigma)\)。构建似然比检验假设:

\[\begin{equation*} H_0:\Sigma=AA^{\top}+D,\quad H_1:\Sigma\text{为其它任一正定矩阵} \end{equation*}\]

性质 6.4.6(1)可得此时备择假设下的对数似然函数为:

\[\begin{align*} L_1&=\sum_{i=1}^{p}\ln\left\{\frac{1}{(2\pi)^{\frac{m}{2}}(\det\Sigma)^{\frac{1}{2}}}e^{-\frac{1}{2}\operatorname{tr}[(\mathbf{X_i}-\boldsymbol{\mu})(\mathbf{X_i}-\boldsymbol{\mu})^{\top}\Sigma^{-1}]}\right\} \\ &=\sum_{i=1}^{p}\left\{-\frac{m}{2}\ln(2\pi)-\frac{1}{2}\ln(\det\Sigma)-\frac{1}{2}\operatorname{tr}[(\mathbf{X_i}-\boldsymbol{\mu})(\mathbf{X_i}-\boldsymbol{\mu})^{\top}\Sigma^{-1}]\right\} \\ &=-\frac{p}{2}\left\{m\ln(2\pi)+\ln(\det\Sigma)+\frac{1}{p}\sum_{i=1}^{p}\operatorname{tr}[(\mathbf{X_i}-\boldsymbol{\mu})(\mathbf{X_i}-\boldsymbol{\mu})^{\top}\Sigma^{-1}]\right\} \end{align*}\]

上式可以化为2

\[\begin{equation*} L_1(\Sigma)=-\frac{p}{2}\left[m\ln(2\pi)+\ln(\det\Sigma)+\operatorname{tr}(S\Sigma^{-1})\right] \end{equation*}\]

其中\(S\)为样本协方差阵。这个似然函数在\(\Sigma=S\)时取最大值证明,于是:

\[\begin{equation*} L_1=-\frac{p}{2}[m\ln(2\pi)+\ln(\det S)+p] \end{equation*}\]

同理,此时原假设下的似然函数值为:

\[\begin{equation*} L_2=-\frac{p}{2}\left[m\ln(2\pi)+\ln(\det\hat{\Sigma})+\operatorname{tr}(S\hat{\Sigma})\right] \end{equation*}\]

其中\(\hat{\Sigma}=\hat{A}\hat{A}^{\top}-\hat{D}\)

由似然比检验原理似然比检验可知:

\[\begin{equation*} -2[L_2(\Sigma)-L_1(\Sigma)]\sim\chi^2_{df} \end{equation*}\]

\[\begin{equation*} p[\ln(\det\hat{\Sigma})+\operatorname{tr}(S\hat{\Sigma})-\ln(\det S)-p]>\chi^2_{0.95}(df) \end{equation*}\]

时应拒绝原假设,即\(n\)个因子不足以解释数据,应增大因子个数。其中\(\chi^2_{0.95}(df)\)为分布的\(0.95\)分位数。自由度的计算

16.2.4 因子得分

在拟合得到因子载荷矩阵后,我们可以反过来求解各样本因子的取值,这样一来就可以根据因子值去进行进一步的分析。例如在开头的例子里,我们可以得到每个学生语言能力与理科能力的值,进而可以进行分类或选择。因子得分有两种计算方式。

16.2.4.1 加权最小二乘法

Derivation 16.4. 考虑加权最小二乘函数:

\[\begin{equation*} \varphi(F)=(\mathbf{X}-\boldsymbol{\mu}-AF)^{\top}D^{-1}(\mathbf{X}-\boldsymbol{\mu}-AF) \end{equation*}\]

求:

\[\begin{equation*} \hat{F}=\arg\min\varphi(F) \end{equation*}\]

由极值的必要条件得到:

\[\begin{gather*} \frac{\partial\varphi(F)}{\partial F}=-2A^{\top}D^{-1}(\mathbf{X}-\boldsymbol{\mu}-AF)=0 \\ A^{\top}D^{-1}(\mathbf{X}-\boldsymbol{\mu})=A^{\top}D^{-1}AF \\ F=(A^{\top}D^{-1}A)^{-1}A^{\top}D^{-1}(\mathbf{X}-\boldsymbol{\mu}) \end{gather*}\]

需要注意\(A^{\top}D^{-1}A\)的可逆性。

若认为\(\mathbf{X}\sim\operatorname{N}_m(\boldsymbol{\mu}+AF,D)\),则上述解得的\(F\)也是极大似然估计的结果。

Definition 16.7. 称加权最小二乘法得到的因子得分为Bartlett因子得分。

从求解过程可以看出,该方法实际上是对特殊方差更大的变量施以更宽容的残差值。

16.2.4.2 回归法

Derivation 16.5. 设:

\[\begin{equation*} f_j=\sum_{i=1}^{m}b_{ji}(\mathbf{X}_i-\boldsymbol{\mu}_i)+\varepsilon_j,\;\operatorname{Cov}(\mathbf{X}_i,\varepsilon_j)=0,\quad j=1,2,\dots,n \end{equation*}\]

性质 16.2.1(4)性质 6.3.4(3)(5)可知:

\[\begin{equation*} a_{ij}=\operatorname{Cov}(\mathbf{X}_i,f_j)=\operatorname{Cov}\left[\mathbf{X}_i,\sum_{k=1}^{m}b_{jk}(\mathbf{X}_k-\boldsymbol{\mu}_k)+\varepsilon_j\right]=\sum_{k=1}^{m}\sigma_{ik}b_{jk} \end{equation*}\]

\(B=(b_{ij})\),则有:

\[\begin{equation*} A=\Sigma B^{\top} \end{equation*}\]

于是\(B=A^{\top}\Sigma^{-1}\),需要注意\(\Sigma\)的可逆性。回归法的因子得分即为:

\[\begin{equation*} F=A^{\top}\Sigma^{-1}(\mathbf{X}-\boldsymbol{\mu}) \end{equation*}\]

16.3 非负矩阵分解

许多统计数据都可以自然地组织成一个非负矩阵。例如,在文本分析中,矩阵的行可以表示词语,列可以表示文档,矩阵元素表示某个词在某篇文档中的出现频数;在图像分析中,矩阵元素可以表示像素强度;在推荐系统中,矩阵元素可以表示用户对商品的评分或交互次数;在基因表达分析中,矩阵元素可以表示某个基因在某个样本或细胞中的表达强度。虽然这些数据来自不同问题,但它们有一个共同特点:观测矩阵往往维度很高,而真正支配数据变化的结构通常远少于原始维度。

因此,一个自然的统计问题是:能否用少数潜在成分来近似解释原始数据?设观测数据矩阵\(X=(x_{ij})\in\mathbb{R}^{n\times p}\),且\(x_{ij}\geqslant0\)非负矩阵分解(non-negative matrix factorization)希望寻找两个非负矩阵:

\[\begin{equation*} W=(w_{ik})\in\mathbb{R}^{n\times r},\quad H=(h_{kj})\in\mathbb{R}^{r\times p},\quad w_{ik}\geqslant0,\quad h_{kj}\geqslant0 \end{equation*}\]

使得:

\[\begin{equation*} X\approx WH,\quad r<\min\{n,p\} \end{equation*}\]

这里的分解并不只是为了压缩数据,更重要的是希望把复杂观测拆解为少数可解释的潜在结构。\(r\)称为分解秩或潜在因子数。每个样本列向量\(x_j\)都有近似表示:

\[\begin{equation*} x_j\approx Wh_j=\sum_{k=1}^{r}h_{kj}w_k,\quad h_{kj}\geqslant0 \end{equation*}\]

直观上,\(W\)的第\(k\)列可理解为第\(k\)个非负基向量,\(H\)的第\(k\)行给出该基向量在各个样本中的非负系数。换言之,矩阵分解试图回答的问题是:原始高维数据是否可以由少数共同模式组合而成?

经典的低秩分解方法,如PCA或SVD,也是在回答类似问题。它们通过寻找低维线性子空间来获得最优的线性低秩近似,从而在平方误差意义下有效保留数据中的主要变化方向。然而,对于天然非负的数据,这类方法存在一个解释上的困难:分解得到的基向量和系数通常允许取负值。负值在代数上没有问题,甚至对最优线性近似是有利的,因为它允许不同方向之间通过正负抵消来表示数据;但在许多实际问题中,这种抵消机制并不符合数据生成过程。例如,词频不能解释为某些主题词的正贡献再减去另一些主题词的负贡献,像素强度也不能自然地解释为若干局部图像部件之间的正负抵消,基因表达强度同样更适合被理解为若干表达程序的非负叠加。

Definition 16.8. 设\(X=(x_{ij})\in\mathbb{R}^{n\times p}\)\(x_{ij}\geqslant0\),给定正整数\(r<\min\{m,n\}\)。若存在\(W\in\mathbb{R}^{n\times r},\;H\in\mathbb{R}^{p\times n}\)满足:

\[\begin{equation*} X\approx WH,\quad W=(w_{ik})\in\mathbb{R}^{n\times r},\quad H=(h_{kj})\in\mathbb{R}^{r\times p},\quad w_{ik}\geqslant0,\quad h_{kj}\geqslant0 \end{equation*}\]

则称\(X\approx WH\)\(X\)的非负矩阵分解。其中\(W\)称为基矩阵,\(H\)称为系数矩阵。

Property 16.3.1. 非负矩阵分解具有如下基本性质:

  1. 分解不唯一。

  2. \(\operatorname{rank}(WH)\leqslant r\),即非负矩阵分解是一种带有非负约束的低秩近似方法。

证明. (1)改变分解矩阵行列的排列顺序、对分解矩阵进行放缩或对分解矩阵进行可逆变换即可给出同一矩阵的多种分解结果。

(4)由性质 1.1.3(9)立即可得。 ◻

16.3.1 目标函数

16.3.1.1 Frobenius范数目标

当数据近似服从加性高斯噪声模型时,最常用的目标函数是平方误差:

\[\begin{equation*} \min_{W,H}\;F(W,H)=\frac{1}{2}||X-WH||_F^2,\quad W\geqslant0,\quad H\geqslant0 \end{equation*}\]

其中:

\[\begin{equation*} ||A||_F^2=\sum_{i=1}^{m}\sum_{j=1}^{n}a_{ij}^2=\operatorname{tr}(A^{\top}A) \end{equation*}\]

称为矩阵\(A\)的Frobenius范数平方。

Derivation 16.6. 对\(F(W,H)\)求导可得:

\[\begin{align*} \nabla_WF(W,H)&=(WH-X)H^{\top}=WHH^{\top}-XH^{\top} \\ \nabla_HF(W,H)&=W^{\top}(WH-X)=W^{\top}WH-W^{\top}X \end{align*}\]

若暂时不考虑非负约束,则固定\(W\)时关于\(H\)的最优解满足正规方程:

\[\begin{equation*} W^{\top}WH=W^{\top}X \end{equation*}\]

固定\(H\)时关于\(W\)的最优解满足:

\[\begin{equation*} WHH^{\top}=XH^{\top} \end{equation*}\]

非负约束使得这两个线性方程不能直接给出最终解,但它们解释了许多迭代算法的来源:每次固定一边,更新另一边,使得重构误差逐步下降。

16.3.1.2 KL散度目标

\(X\)是计数矩阵或频数矩阵时,常用如下广义KL散度度量\(X\)\(Y=WH\)之间的差异:

\[\begin{equation*} D(X\|WH)=\sum_{i=1}^{m}\sum_{j=1}^{n}\left[x_{ij}\ln\frac{x_{ij}}{(WH)_{ij}}-x_{ij}+(WH)_{ij}\right] \end{equation*}\]

其中约定\(0\ln0=0\)。这一目标与Poisson模型关系密切:若\(x_{ij}\)近似服从均值为\((WH)_{ij}\)的Poisson分布且各元素独立,则最大化似然等价于最小化\(D(X\|WH)\)

note 16.2. Frobenius目标更接近连续型强度数据的平方误差近似,KL散度目标更适合非负计数数据或相对比例结构明显的数据。实际使用时,目标函数的选择不只是计算问题,也是在选择误差模型。

16.4 典型相关分析

典型相关分析(canonical correlation analysis)

16.4.1 总体典型相关分析

Definition 16.9. 设\(\mathbf{X},\mathbf{Y}\)分别是\(m,n\)维随机向量,\(m+n\)维随机向量\((\mathbf{X},\mathbf{Y})^{\top}\)的均值向量\(\boldsymbol{\mu}=\mathbf{0}\),协方差矩阵\(\Sigma\)是正定阵。对\(\mathbf{X},\mathbf{Y}\)分别进行线性变换\(\mathcal{T}_1,\mathcal{T}_2\)得到两个\(p\)维随机向量\(\mathbf{U}=\mathbf{U}_1, \mathbf{U}_2, \dots, \mathbf{U}_{p},\;\mathbf{V}=\mathbf{V}_1, \mathbf{V}_2, \dots, \mathbf{V}_{p}\)\(\mathcal{T}_1\)\(\mathcal{T}_2\)的矩阵分别为:

\[\begin{equation*} A= \begin{pmatrix} \alpha_1^{\top} \\ \alpha_2^{\top} \\ \vdots \\ \alpha_p^{\top} \end{pmatrix},\quad B= \begin{pmatrix} \beta_1^{\top} \\ \beta_2^{\top} \\ \vdots \\ \beta_p^{\top} \end{pmatrix} \end{equation*}\]

若:

  1. \(\mathbf{U}_i,\mathbf{V}_i\)和之前的\(i-1\)对变量都不相关,即:

    \[\begin{equation*} \operatorname{Corr}(\mathbf{U}_i,\mathbf{U}_j)=\operatorname{Corr}(\mathbf{U}_i,\mathbf{V}_j)=\operatorname{Corr}(\mathbf{V}_i,\mathbf{V}_j)=\operatorname{Corr}(\mathbf{V}_i,\mathbf{U}_j)=0,\quad j=1,2,\dots,i-1 \end{equation*}\]

  2. \(\operatorname{Corr}(\mathbf{U}_i,\mathbf{V}_i)=\max\limits_{\alpha,\beta}\operatorname{Corr}(\alpha^{\top}\mathbf{X},\beta^{\top}\mathbf{Y})\)

则称\(\mathbf{U}_i,\mathbf{V}_i\)是第\(i\)典型变量(canonical variable)\(i=1,2,\dots,p\)

这一定义是否足够?

Theorem 16.3. 若不对\(\mathcal{T}_1,\mathcal{T}_2\)的矩阵\(A,B\)作出相应的限制,任何一对典型变量都不唯一。

证明. 由相关系数的性质可知,对随机变量作线性变换不影响它们之间的线性关系,即对任意的\(a,b,c,d\in\mathbb{R}^{}\),有:

\[\begin{equation*} \operatorname{Corr}(\alpha_i^{\top}\mathbf{X},\beta_i^{\top}\mathbf{Y})=\operatorname{Corr}[a(\alpha_i^{\top}\mathbf{X})+b,c(\beta_i^{\top}\mathbf{Y})+d],\quad i=1,2,\dots,p \end{equation*}\]

所以任何一对典型变量都不唯一。 相关系数的性质 ◻

因此我们需要对\(A,B\)进行相应的限制。

Definition 16.10. 设\(\mathbf{X},\mathbf{Y}\)分别是\(m,n\)维随机向量,\(m+n\)维随机向量\((\mathbf{X},\mathbf{Y})^{\top}\)的均值向量\(\boldsymbol{\mu}=\mathbf{0}\),协方差矩阵\(\Sigma\)是正定阵。对\(\mathbf{X},\mathbf{Y}\)分别进行线性变换\(\mathcal{T}_1,\mathcal{T}_2\)得到两个\(p\)维随机向量\(\mathbf{U}=\mathbf{U}_1, \mathbf{U}_2, \dots, \mathbf{U}_{p},\;\mathbf{V}=\mathbf{V}_1, \mathbf{V}_2, \dots, \mathbf{V}_{p}\)\(\mathcal{T}_1\)\(\mathcal{T}_2\)的矩阵分别为:

\[\begin{equation*} A= \begin{pmatrix} \alpha_1^{\top} \\ \alpha_2^{\top} \\ \vdots \\ \alpha_p^{\top} \end{pmatrix},\quad B= \begin{pmatrix} \beta_1^{\top} \\ \beta_2^{\top} \\ \vdots \\ \beta_p^{\top} \end{pmatrix} \end{equation*}\]

若:

  1. \(\mathbf{U}_i,\mathbf{V}_i\)和之前的\(i-1\)对变量都不相关,即:

    \[\begin{equation*} \operatorname{Corr}(\mathbf{U}_i,\mathbf{U}_j)=\operatorname{Corr}(\mathbf{U}_i,\mathbf{V}_j)=\operatorname{Corr}(\mathbf{V}_i,\mathbf{V}_j)=\operatorname{Corr}(\mathbf{V}_i,\mathbf{U}_j)=0,\quad j=1,2,\dots,i-1 \end{equation*}\]

  2. \(\operatorname{Corr}(\mathbf{U}_i,\mathbf{V}_i)=\max\limits_{\alpha,\beta}\operatorname{Corr}(\alpha^{\top}\mathbf{X},\beta^{\top}\mathbf{Y})\)

  3. \(\operatorname{Var}(\mathbf{U}_i)=\operatorname{Var}(\mathbf{V}_i)=1,\;i=1,2,\dots,p\)

则称\(\mathbf{U}_i,\mathbf{V}_i\)是第\(i\)对典型变量,\(\operatorname{Corr}(\mathbf{U}_i,\mathbf{V}_i)\)为第\(i\)典型相关系数,\(i=1,2,\dots,p\)

Theorem 16.4. 设\(\mathbf{X},\mathbf{Y}\)分别是\(m,n\)维随机向量,\(m+n\)维随机向量\(\mathbf{Z}=(\mathbf{X},\mathbf{Y})^{\top}\)的均值向量\(\boldsymbol{\mu}=\mathbf{0}\),协方差矩阵\(\Sigma\)是正定阵,其中:

\[\begin{equation*} \Sigma= \begin{pmatrix} \Sigma_{11} & \Sigma_{12} \\ \Sigma_{21} & \Sigma_{22} \end{pmatrix} \end{equation*}\]

\(M=\Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}\)\(M\)的特征值从大到小为\(\lambda_1, \lambda_2, \dots, \lambda_{m}\),对应的正交化特征向量为\(a_1, a_2, \dots, a_{m}\),设:

\[\begin{equation*} b_i=\Sigma_{22}^{-1}\Sigma_{21}a_i,\quad\alpha_i=\frac{a_i}{\sqrt{a_i^{\top}\Sigma_{11}a_i}},\quad\beta_i=\frac{b_i}{\sqrt{b_i^{\top}\Sigma_{22}b_i}} \end{equation*}\]

\(\sqrt{\lambda_i^2}\)为第\(i\)对典型相关系数,\(\mathbf{U}_i=\alpha_i^{\top}\mathbf{X},\mathbf{V}_i=\beta_i^{\top}\mathbf{Y}\)是第\(i\)对典型变量。

证明. 求第一对典型相关系数的过程等价于求解下述约束优化问题:

\[\begin{gather*} \max\operatorname{Corr}(\mathbf{U}_1,\mathbf{V_1})=\alpha_1^{\top}\Sigma_{12}\beta_1 \\ \operatorname{s.t.} \begin{cases} \operatorname{Var}(\mathbf{U}_1)=\alpha_1^{\top}\Sigma_{11}\alpha_1=1 \\ \operatorname{Var}(\mathbf{V}_1)=\beta_1^{\top}\Sigma_{22}\beta_1=1 \end{cases} \end{gather*}\]

使用Lagrange乘子法进行求解,构造Lagrange函数:

\[\begin{equation*} L(\alpha_1,\beta_1,s,t)=\alpha_1^{\top}\Sigma_{12}\beta_1-\frac{s}{2}(\alpha_1^{\top}\Sigma_{11}\alpha_1-1)-\frac{t}{2}(\beta_1^{\top}\Sigma_{22}\beta_1-1) \end{equation*}\]

利用矩阵求导可得:

\[\begin{gather*} \frac{\partial L(\alpha_1,\beta_1,s,t)}{\partial\alpha_1}=\Sigma_{12}\beta_1-s\Sigma_{11}\alpha_1 \\ \frac{\partial L(\alpha_1,\beta_1,s,t)}{\partial\beta_1}=\Sigma_{21}\alpha_1-t\Sigma_{22}\beta_1 \\ \frac{\partial L(\alpha_1,\beta_1,s,t)}{\partial s}=\alpha_1^{\top}\Sigma_{11}\alpha_1-1 \\ \frac{\partial L(\alpha_1,\beta_1,s,t)}{\partial t}=\beta_1^{\top}\Sigma_{22}\beta_1-1 \end{gather*}\]

令上四式全部为\(0\),即:

\[\begin{equation*} \Sigma_{12}\beta_1-s\Sigma_{11}\alpha_1=0,\quad\Sigma_{21}\alpha_1-t\Sigma_{22}\beta_1=0,\quad\alpha_1^{\top}\Sigma_{11}\alpha_1-1=0,\quad\beta_1^{\top}\Sigma_{22}\beta_1-1=0 \end{equation*}\]

在上第一式和第二式两边分别同乘\(\alpha_1^{\top}\)\(\beta_1^{\top}\)可得\(s=t\)。因为\(\Sigma\)正定,由定理 2.17(6)可知\(\Sigma\)可逆,于是\(\Sigma_{11}^{-1},\Sigma_{22}^{-1}\)存在。注意到:

\[\begin{equation*} s\alpha_1=\Sigma_{11}^{-1}\Sigma_{12}\beta_1,\quad s\beta_1=\Sigma_{22}^{-1}\Sigma_{21}\alpha \end{equation*}\]

于是有:

\[\begin{equation*} s^2\alpha_1=\Sigma_{11}^{-1}\Sigma_{12}s\beta_1=\Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}\alpha_1,\quad s^2\beta_1=\Sigma_{22}^{-1}\Sigma_{21}s\alpha_1=\Sigma_{22}^{-1}\Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12}\beta_1 \end{equation*}\]

\(s^2\)\(\Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}\)\(\Sigma_{22}^{-1}\Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12}\)共同的特征值。由性质 2.6.1(3)可知\(\Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}\)\(\Sigma_{22}^{-1}\Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12}\)具有相同的非零特征值。因为:

\[\begin{equation*} \operatorname{Corr}(\mathbf{U}_1,\mathbf{V}_1)=\alpha_1^{\top}\Sigma_{12}\beta_1=\alpha_1^{\top}s\Sigma_{11}\alpha_1=s\alpha_1^{\top}\Sigma_{11}\alpha_1=s \end{equation*}\]

所以优化问题的解为\(\Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}\)\(\Sigma_{22}^{-1}\Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12}\)的最大特征值\(s^2\)\(\Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}\)的特征值\(s^2\)对应的满足\(\alpha_1^{\top}\Sigma_{11}\alpha_1=1\)的特征向量\(\alpha_1\)\(\Sigma_{22}^{-1}\Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12}\)的特征值\(s^2\)对应的满足\(\beta_1^{\top}\Sigma_{22}\beta_1=1\)的特征向量\(\beta_1\)。显然结论对第\(1\)对典型变量成立。

考虑第\(i\)对典型变量,此时的优化问题为:

\[\begin{gather*} \max\operatorname{Corr}(\mathbf{U}_i,\mathbf{V}_i)=\alpha_i^{\top}\Sigma_{12}\beta_i \\ \operatorname{s.t.} \begin{cases} \operatorname{Var}(\mathbf{U}_i)=\alpha_i^{\top}\Sigma_{11}\alpha_i=1 \\ \operatorname{Var}(\mathbf{V}_i)=\beta_i^{\top}\Sigma_{22}\beta_i=1 \\ \operatorname{Cov}(\mathbf{U}_i,\mathbf{U}_j)=\alpha_i^{\top}\Sigma_{11}\alpha_j=0,&j=1,2,\dots,i-1 \\ \operatorname{Cov}(\mathbf{V}_i,\mathbf{V}_j)=\beta_i^{\top}\Sigma_{12}\beta_j=0,&j=1,2,\dots,i-1 \\ \operatorname{Cov}(\mathbf{U}_i,\mathbf{V_j})=\alpha_i^{\top}\Sigma_{12}\beta_j=0,&j=1,2,\dots,i-1 \\ \operatorname{Cov}(\mathbf{V}_i,\mathbf{U}_j)=\beta_i^{\top}\Sigma_{21}\alpha_j=0,&j=1,2,\dots,i-1 \end{cases} \end{gather*}\]

因为\(\Sigma\)正定,所以\(\Sigma_{11}\)\(\Sigma_{22}\)正定,即存在\(\Sigma_{11}^{-\frac{1}{2}}\)\(\Sigma_{22}^{-\frac{1}{2}}\)。令:

\[\begin{equation*} \gamma=\Sigma_{11}^{\frac{1}{2}}\alpha_i,\quad\delta=\Sigma_{22}^{\frac{1}{2}}\beta_i,\quad\gamma_j=\Sigma_{11}^{\frac{1}{2}}\alpha_j,\quad\delta_j=\Sigma_{22}^{\frac{1}{2}}\beta_j,\quad j=1,2,\dots,i-1 \end{equation*}\]

同时\(\gamma\)\(\alpha_i\)\(\delta\)\(\beta_i\)\(\gamma_j\)\(\alpha_j\)\(\delta_j\)\(\beta_j\)都是一一对应的关系。由性质 19.4.4(3),此时约束条件可改写为:

\[\begin{equation*} \begin{cases} \operatorname{Var}(\mathbf{U}_i)=\alpha_i^{\top}\Sigma_{11}\alpha_i=||\gamma||=1 \\ \operatorname{Var}(\mathbf{V}_i)=\beta_i^{\top}\Sigma_{22}\beta_i=||\delta||=1 \\ \operatorname{Cov}(\mathbf{U}_i,\mathbf{U}_j)=\alpha_i^{\top}\Sigma_{11}\alpha_j=\gamma^{\top}\gamma_j=0 \\ \operatorname{Cov}(\mathbf{V}_i,\mathbf{V}_j)=\beta_i^{\top}\Sigma_{12}\beta_j=\delta^{\top}\delta_j=0 \\ \operatorname{Cov}(\mathbf{U}_i,\mathbf{V_j})=\alpha_i^{\top}\Sigma_{12}\beta_j=(\Sigma_{11}^{-\frac{1}{2}}\gamma)^{\top}\Sigma_{12}\Sigma_{22}^{-\frac{1}{2}}\delta_j=\gamma^{\top}\Sigma_{11}^{-\frac{1}{2}}\Sigma_{12}\Sigma_{22}^{-\frac{1}{2}}\delta_j=0 \\ \operatorname{Cov}(\mathbf{V}_i,\mathbf{U}_j)=\beta_i^{\top}\Sigma_{21}\alpha_j=(\Sigma_{22}^{-\frac{1}{2}}\delta)^{\top}\Sigma_{21}(\Sigma_{11}^{-\frac{1}{2}}\gamma_j)=\delta^{\top}\Sigma_{22}^{-\frac{1}{2}}\Sigma_{21}\Sigma_{11}^{-\frac{1}{2}}\gamma_j=0 \end{cases} \end{equation*}\]

\(K=\Sigma_{11}^{-\frac{1}{2}}\Sigma_{12}\Sigma_{22}^{-\frac{1}{2}}\),则最后两个约束条件可改写为\(\gamma^{\top}K\delta_j=0,\;\delta^{\top}K^{\top}\gamma_j=0,\;j=1,2,\dots,i-1\),目标函数可改写为\(\alpha_i^{\top}\Sigma_{12}\beta_i=(\Sigma_{11}^{-\frac{1}{2}}\gamma)^{\top}\Sigma_{12}(\Sigma_{22}^{-\frac{1}{2}}\delta)=\gamma^{\top}\Sigma_{11}^{-\frac{1}{2}}\Sigma_{12}\Sigma_{22}^{-\frac{1}{2}}\delta=\gamma^{\top}K\delta\)。由不等式 3可得:

\[\begin{equation*} |\gamma^{\top}K\delta|\leqslant||K^{\top}\gamma||\;||\delta|| \end{equation*}\]

由取等条件和第二个约束条件可知固定\(\gamma\)情况下\(\delta\)的最优取值为\(\dfrac{K^{\top}\gamma}{||K^{\top}\gamma||}\),此时目标函数值为:

\[\begin{equation*} \gamma^{\top}K\delta=\frac{\gamma^{\top}KK^{\top}\gamma}{||K^{\top}\gamma||}=(\gamma^{\top}KK^{\top}\gamma)^\frac{1}{2} \end{equation*}\]

接下来在第一个约束条件和第三个约束条件下求上式的最大值。

\(\operatorname{rank}(K)=r\),由定理 2.25可知\(KK^{\top}\)是半正定矩阵,根据定理 2.18(3.5)性质 2.6.3(3)可知\(\gamma^{\top}KK^{\top}\gamma\)有如下分解:

\[\begin{equation*} \gamma^{\top}KK^{\top}\gamma=\gamma^{\top}\left(\sum_{i=1}^{r}\varphi_i^2l_i^{\top}l_i\right)\gamma= \end{equation*}\]

16.5 判别分析

判别分析的目的为判断样本最有可能属于哪一个总体,这属于一个分类问题。它利用已知分类的样本(称之为训练样本,训练样本的集合称为训练集)去估计判别函数(即一个以样本为自变量的函数,我们利用该函数的取值将样本进行分类)的具体形式。

16.5.1 距离判别

Definition 16.11. 设有\(n\)个总体\(D_i\),它们的均值向量与协方差矩阵分别为\(\boldsymbol{\mu_i},\Sigma_i,\;i=1,2,\dots,n\)。现存在一个从上述\(n\)个总体中抽取出的样本\(x\),若将其判给满足:

\[\begin{equation*} j=\arg\min d^2_m(x,D_i)=(x-\boldsymbol{\mu})^{\top}\Sigma^{-1}(x-\boldsymbol{\mu}) \end{equation*}\]

的分布\(D_j\),称这种判别方法为距离判别。距离判别的判别函数为:

\[\begin{equation*} (x-\boldsymbol{\mu})^{\top}\hat{\Sigma}^{-1}(x-\boldsymbol{\mu}) \end{equation*}\]

16.5.2 Bayesian判别

16.5.3 Fisher判别

Definition 16.12. 设有\(n\)个总体\(D_i\),它们的均值向量与协方差矩阵分别为\(\boldsymbol{\mu_i},\Sigma_i,\;i=1,2,\dots,n\)。现存在一个从上述\(n\)个总体中抽取出的未知分类的样本\(x\),记线性判别函数为\(u(y)=\alpha^{\top}y\),并且记:

\[\begin{equation*} u_i=\operatorname{E}[u(\mathbf{X})|\mathbf{X}\in D_i],\quad\overline{u}=\frac{1}{n}\sum_{i=1}^{n}u_i,\quad\sigma_i^2=\operatorname{Var}[u(\mathbf{X})|\mathbf{X}\in D_i] \end{equation*}\]

\(\alpha\)满足:

\[\begin{equation*} \alpha=\arg\max\frac{\sum\limits_{i=1}^{n}(u_i-\overline{u})^2}{\sum\limits_{i=1}^{n}\sigma_i^2} \end{equation*}\]

Fisher提议将\(x\)判给满足:

\[\begin{equation*} j=\arg\min|u(x)-u_i| \end{equation*}\]

的分布\(D_j\),称这种判别方法为Fisher判别。Fisher判别的判别函数为:

\[\begin{equation*} |\hat{u}(x)-\hat{u}_i| \end{equation*}\]

note 16.3. 在实际分析中,我们会取:

\[\begin{equation*} \alpha=\arg\max\frac{\sum\limits_{i=1}^{n}n_i(u_i-\overline{u})^2}{\sum\limits_{i=1}^{n}(n_i-1)\sigma_i^2} \end{equation*}\]

其中\(n_i\)为训练集中属于总体\(D_i\)的样本数。从接下来的分析可以看出这样作实际上有利于求解\(\alpha\)

Theorem 16.5. 设从总体\(D_i\)中获取到了\(n_i\)个样本\(x^{(i)}_j,\;i=1,2,\dots,n,\;j=1,2,\dots,n_i\)。Fisher中的\(\alpha\)为矩阵\(B\)关于矩阵\(S\)的最大特征值对应的特征向量,\(B\)\(S\)的定义请见证明过程。

证明. 注意到此时有:

\[\begin{gather*} \hat{u}_i=\frac{1}{n_i}\sum_{j=1}^{n_i}\alpha^{\top}x^{(i)}_j=\alpha^{\top}\overline{x^{(i)}},\;i=1,2,\dots,n \\ \hat{\overline{u}}=\frac{1}{n}\sum_{i=1}^{n}\hat{u}_i=\frac{1}{n}\sum_{i=1}^{n}\alpha^{\top}\overline{x^{(i)}}=\alpha^{\top}\overline{x} \\ \begin{aligned} \hat{\sigma}_i^2 &=\frac{1}{n_i-1}\sum_{j=1}^{n_i}[u(x^{(i)}_j)-\hat{u}_i]^2=\frac{1}{n_i-1}\sum_{j=1}^{n_i}[\alpha^{\top}x^{(i)}_j-\alpha^{\top}\overline{x^{(i)}}]^2 \\ &=\frac{1}{n_i-1}\sum_{j=1}^{n_i}[\alpha^{\top}(x^{(i)}_j-\overline{x^{(i)}})]^2=\frac{1}{n_i-1}\sum_{j=1}^{n_i}\alpha^{\top}(x^{(i)}_j-\overline{x^{(i)}})(x^{(i)}_j-\overline{x^{(i)}})^{\top}\alpha \\ &=\frac{1}{n_i-1}\alpha^{\top}\left[\sum_{j=1}^{n_i}(x^{(i)}_j-\overline{x^{(i)}})(x^{(i)}_j-\overline{x^{(i)}})^{\top}\right]\alpha\coloneqq\frac{1}{n_i-1}\alpha^{\top}S_i\alpha \end{aligned} \end{gather*}\]

于是:

\[\begin{gather*} \sum_{i=1}^{n}(n_i-1)\sigma_i^2=\sum_{i=1}^{n}(n_i-1)\frac{1}{n_i-1}\alpha^{\top}S_i\alpha\coloneqq\alpha^{\top}S\alpha \\ \sum_{i=1}^{n}n_i(\hat{u}_i-\hat{\overline{u}})^2=\sum_{i=1}^{n}n_i[\alpha^{\top}\overline{x^{(i)}}-\alpha^{\top}\overline{x}]^2=\sum_{i=1}^{n}n_i\alpha^{\top}(\overline{x^{(i)}}-\overline{x})(\overline{x^{(i)}}-\overline{x})^{\top}\alpha\coloneqq\alpha^{\top}B\alpha \end{gather*}\]

所以:

\[\begin{equation*} \alpha=\arg\max\frac{\alpha^{\top}B\alpha}{\alpha^{\top}S\alpha} \end{equation*}\]

但若此时不作任何限制,由于对\(\alpha\)作任意倍的放缩都满足上式,所以解得的\(\alpha\)并不唯一,我们人为地添加约束条件\(\alpha^{\top}S\alpha=1\),于是该最优化问题变为:

\[\begin{gather*} \alpha=\arg\max\frac{\alpha^{\top}B\alpha}{\alpha^{\top}S\alpha} \\ \operatorname{s.t.}\alpha^{\top}S\alpha=1 \end{gather*}\]

使用Lagrange乘子法进行求解,引入Lagrange乘子\(\lambda\)构造Lagrange函数:

\[\begin{equation*} L(\alpha,\lambda)=\alpha^{\top}B\alpha-\lambda(\alpha^{\top}S\alpha-1) \end{equation*}\]

求导可得:

\[\begin{equation*} \frac{\partial L(\alpha,\lambda)}{\partial\alpha}=2B\alpha-2\lambda S\alpha,\quad\frac{\partial L(\alpha,\lambda)}{\partial\lambda}=1-\alpha^{\top}S\alpha=0 \end{equation*}\]

于是只需令上第一式为\(0\),即:

\[\begin{equation*} B\alpha=\lambda S\alpha \end{equation*}\]

所以\(\lambda\)为矩阵\(B\)关于矩阵\(S\)的广义特征值,此时目标函数为:

\[\begin{equation*} \alpha^{\top}B\alpha=\lambda\alpha^{\top}S\alpha=\lambda \end{equation*}\]

由此可以看出该最优化问题的最优解为\(\lambda\)是最大的广义特征值且\(\alpha\)为对应于\(\lambda\)的特征向量。 ◻

16.6 聚类分析

聚类分析(clustering analysis)是一类在不依赖任何先验标签信息的前提下,根据样本之间的相似性或距离关系,对数据进行划分的方法。形式上,聚类算法为每个样本分配一个簇标签,但从方法论角度看,聚类分析并不以标签本身为研究终点,而是试图通过这些标签揭示数据中潜在的结构性特征。

更准确地说,聚类分析的本质是一种结构发现(structure discovery)方法。它旨在回答如下问题:数据是否可以被视为由若干相对同质的子群体构成?这些子群体在统计特征、生成机制或行为模式上是否存在系统性差异?因此,聚类标签应被理解为对数据结构的一种抽象描述,而非具有直接语义的分类结果。

在统计学习与数据分析框架下,聚类的目的可以从以下几个相互关联的层面来理解。

  1. 结构发现与探索性分析:通过样本间相似性关系揭示数据中潜在的分组结构与异质性特征,例如多模态、分层或局部聚集等现象。从方法论上看,聚类属于典型的探索性数据分析手段,其结果主要用于辅助理解数据结构、生成研究假设并为后续建模提供依据,而非作为最终分析结论;

  2. 数据抽象与降低复杂度:在高维或大规模数据情形下,直接以单个样本为分析对象往往会带来计算和解释上的困难。聚类通过将大量样本映射为有限个簇,实现了从”个体层面”到”群体层面”的抽象。这种抽象使得研究者可以以簇为基本单元,对数据进行更高层次的描述、比较与总结。例如,可以利用簇的中心、分布特征或代表性样本来刻画原始数据,从而提高分析的可解释性与可操作性;

  3. 异质性刻画与分群建模:在许多应用场景中,整体数据往往并非来自单一同质总体,而是由多个具有不同统计特性或生成机制的子群体混合而成。如果忽略这种异质性而直接建立统一的全局模型,往往会导致模型拟合能力下降,甚至产生误导性的结论。此时聚类分析可以帮助识别潜在的异质子群体,并为后续的分群建模提供依据。例如,可以在不同簇内分别建立回归模型、风险模型或预测模型,比较模型参数在不同簇之间的差异,从而揭示不同子群体可能遵循的不同机制;

16.6.1 评价指标

聚类评价指标的核心目标是量化:

  • 簇内紧凑性(compactness):同一簇里的点是否彼此接近;

  • 簇间分离性(separation):不同簇之间是否彼此远离;

  • 与外部标签一致性(agreement with ground truth):当存在真实标签时,聚类是否复现了真实分组。

具体而言,聚类评价指标可以分为下述几类:

  1. 内部指标(Internal Validation):只依赖数据与聚类标签(不需要真实标签);

  2. 外部指标(External Validation):需要真实标签。

需要强调的是,外部评价指标的引入并不意味着聚类任务转化为监督学习问题。外部指标的核心作用在于:当研究者在特定观测样本集中事先掌握某种参考划分时,用以分析既有标签与数据内在结构之间的一致性关系。从而对聚类算法、距离度量或参数设置进行事后评估与比较。因此,外部指标并不参与聚类过程本身,也不作为聚类目标函数进行优化,而是作为一种方法学意义上的对照标准,为研究者理解聚类结果与现实语义之间的关系提供了一种量化参照,帮助研究者理解数据自身在多大程度上支持、修正或挑战已有的分类体系。

当外部一致性较高时,说明在当前特征表示与距离度量下,数据的几何或统计结构能够较好地支持既定的类别划分;例如,在文本主题分析或基因表达数据中,若聚类结果与人工标注的主题类别或生物亚型高度一致,则可认为该标签在数据空间中具有较清晰的结构基础。相反,当外部一致性较低时,这并不必然意味着聚类算法失效,而可能揭示出标签本身的局限性:例如,在心理测量或社会科学调查中,理论上区分的若干类型可能在实际数据中呈现出连续分布或显著重叠;又如,在医学诊断中,同一疾病标签下的样本可能包含多个具有不同分子机制的亚群。此时,聚类结果与外部标签之间的不一致,反而为研究者提供了重新审视标签定义、发现潜在异质结构或子群划分的线索。

设观测样本集\(\mathcal{D}=\{x_i\}_{i=1}^n,\ x_i\in\mathbb{R}^m\),聚类输出标签\(y_i\in\{1,\dots,K\}\)(或包含噪声\(-1\)),第\(k\)簇为\(C_k=\{i:y_i=k\}\),簇大小\(n_k=|C_k|\),簇中心和总体均值定义为:

\[\begin{equation*} \mu_k=\frac{1}{n_k}\sum_{i\in C_k}x_i,\quad \bar{x}=\frac{1}{n}\sum_{i=1}^n x_i \end{equation*}\]

16.6.1.1 内部指标

Definition 16.13. 称\(\operatorname{WCSS}=\sum\limits_{k=1}^{K}\sum\limits_{i\in C_k}\|x_i-\mu_k\|^2\)簇内平方和(within-cluster sum of squares)

Property 16.6.1. (最优WCSS关于簇数的单调性)

定义:

\[\begin{equation*} \operatorname{WCSS}^\star(K) \coloneq\min_{\{C_1,\dots,C_K\}} \;\sum_{k=1}^K \min_{\mu_k\in\mathbb{R}^m}\sum_{i\in C_k}\|x_i-\mu_k\|^2 \end{equation*}\]

则对任意\(K\geqslant1\)\(\operatorname{WCSS}^\star(K+1)\leqslant \operatorname{WCSS}^\star(K)\)

证明. 取任意一个划分\(C=\{C_1,\dots,C_K\}\)和一个非空簇(如 \(C_1\ne\varnothing\)),将其拆成两个非空子集\(A,B\)

\[\begin{equation*} C_1=A\cup B,\;A\ne\varnothing,\;B\ne\varnothing \end{equation*}\]

并令新划分为\(C'=\{A,B,C_2,\dots,C_K\}\)。对新划分的目标值有:

\[\begin{equation*} \Phi(C') = \min_{\alpha}\sum_{i\in A}\|x_i-\alpha\|^2 +\min_{\beta}\sum_{i\in B}\|x_i-\beta\|^2 +\sum_{k=2}^K \min_{\mu_k\in\mathbb{R}^{m}}\sum_{i\in C_k}\|x_i-\mu_k\|^2 \end{equation*}\]

对任意给定向量\(\gamma\in\mathbb{R}^m\)有:

\[\begin{equation*} \min_{\alpha}\sum_{i\in A}\|x_i-\alpha\|^2 \leqslant\sum_{i\in A}\|x_i-\gamma\|^2,\quad \min_{\beta}\sum_{i\in B}\|x_i-\beta\|^2 \leqslant\sum_{i\in B}\|x_i-\gamma\|^2 \end{equation*}\]

\(\gamma\)为原簇 \(C_1\) 的最优中心,记为 \(\mu_1^\star\),得到:

\[\begin{equation*} \min_{\alpha}\sum_{i\in A}\|x_i-\alpha\|^2 +\min_{\beta}\sum_{i\in B}\|x_i-\beta\|^2 \leqslant \sum_{i\in A}\|x_i-\mu_1^\star\|^2 + \sum_{i\in B}\|x_i-\mu_1^\star\|^2 = \sum_{i\in C_1}\|x_i-\mu_1^\star\|^2 \end{equation*}\]

因此:

\[\begin{equation*} \Phi(C')\leqslant \sum_{i\in C_1}\|x_i-\mu_1^\star\|^2 +\sum_{k=2}^K \min_{\mu_k\in\mathbb{R}^{m}}\sum_{i\in C_k}\|x_i-\mu_k\|^2 = \Phi(\mathcal{C}) \end{equation*}\]

由最小值的不等式性可得:

\[\begin{equation*} \operatorname{WCSS}^\star(K+1)\leqslant\operatorname{WCSS}^\star(K) \end{equation*}\]

note 16.4. \(\operatorname{WCSS}\)是以欧氏距离为基础的簇内紧凑性度量,其数值大小直接反映了样本在各自簇内围绕质心的离散程度。一般而言,\(\operatorname{WCSS}\)越小,表示簇内样本越集中、聚类结果越紧凑,因而在同一簇数\(K\)下聚类质量越好。需要注意的是:

  1. 对固定观测样本集和以\(\operatorname{WCSS}\)为目标函数的算法,由性质 16.6.1可知\(\operatorname{WCSS}\)随簇数\(K\)的增大单调下降;极端情况下,当\(K=n\)时,每个样本单独成簇,\(\operatorname{WCSS}=0\),因此\(\operatorname{WCSS}\)本身不能直接用于比较不同\(K\)下的聚类优劣。尽管\(\operatorname{WCSS}\)\(K\)单调下降,但其下降幅度通常在某一\(K\)值之后显著减缓。通过考察\(\operatorname{WCSS}\)\(K\)变化的曲线,并选取曲线由”陡降”转为”平缓”的拐点,可以在模型复杂度与聚类紧凑性之间取得平衡,从而确定一个合理的簇数,这一方法被称之为肘部法则(elbow method)

  2. 由于\(\operatorname{WCSS}\)基于质心与距离定义,其隐含假设簇内样本呈近似球形或凸形分布,对非凸结构或密度差异较大的簇刻画能力有限;

  3. \(\operatorname{WCSS}\)对特征量纲高度敏感,不同尺度的特征会不均衡地影响距离计算,因此在实际应用中通常需要对特征进行标准化或归一化处理。

Definition 16.14. 称:

\[\begin{equation*} \operatorname{CH}=\frac{\operatorname{tr}(B)/(K-1)}{\operatorname{tr}(W)/(n-K)} \end{equation*}\]

Calinski-Harabasz指数(Calinski-Harabasz index),其中:

\[\begin{equation*} W=\sum_{k=1}^K\sum_{i\in C_k}(x_i-\mu_k)(x_i-\mu_k)^\top,\quad B=\sum_{k=1}^K n_k(\mu_k-\bar{x})(\mu_k-\bar{x})^\top \end{equation*}\]

note 16.5. \(\operatorname{CH}\)指数本质上与单因素方差分析中的\(F\)统计量高度一致。在几何意义上,当簇中心彼此远离且簇内样本高度集中时,\(\operatorname{tr}(B)\) 相对较大而 \(\operatorname{tr}(W)\) 相对较小,从而\(\operatorname{CH}\)取得较大值,表明聚类结构清晰。

Definition 16.15. 对样本\(x_i\),定义:

\[\begin{gather*} a_i\coloneq\frac{1}{|C_{y_i}|-1}\sum_{\substack{j\in C_{y_i}\\ j\neq i}} d(x_i,x_j),\quad b_i\coloneq\min_{\ell\neq y_i}\frac{1}{|C_{\ell}|}\sum_{j\in C_{\ell}} d(x_i,x_j) \\ s_i\coloneq \begin{cases} \dfrac{b_i-a_i}{\max\{a_i,b_i\}},&\max\{a_i,b_i\}\ne0 \\ 0,&\max\{a_i,b_i\}=0 \end{cases},\quad\operatorname{Silhouette}\coloneq\frac{1}{n}\sum_{i=1}^ns_i \end{gather*}\]

Property 16.6.2. (轮廓系数的取值范围)

\(\operatorname{Silhouette}\)轮廓系数的取值范围为\([-1,1]\)

证明. \(\max\{a_i,b_i\}=0\),则\(a_i=b_i=0\),此时\(s_i=0\)。下面假设\(\max\{a_i,b_i\}>0\)。分两种情形讨论:

  1. \(b_i\geqslant a_i\),则\(\max\{a_i,b_i\}=b_i\),从而:

    \[\begin{equation*} s_i=\frac{b_i-a_i}{b_i}=1-\frac{a_i}{b_i} \end{equation*}\]

    由于\(0\leqslant a_i\leqslant b_i\),可得\(0\leqslant \dfrac{a_i}{b_i}\leqslant 1\),因此\(0\leqslant s_i\leqslant 1\)

  2. \(a_i>b_i\),则\(\max\{a_i,b_i\}=a_i\),从而:

    \[\begin{equation*} s_i=\frac{b_i-a_i}{a_i}=\frac{b_i}{a_i}-1 \end{equation*}\]

    由于\(0\leqslant b_i<a_i\),可得\(0\leqslant\dfrac{b_i}{a_i}<1\),因此\(-1\leqslant s_i<0.\)

综上,\(s_i\in[-1,1]\),即\(\operatorname{Silhouette}\in[-1,1]\)。 ◻

note 16.6. (Silhouette 的几何解释)

轮廓系数从几何角度刻画了单个样本在其所属簇中的相对位置。其中,\(a_i\)衡量样本\(x_i\)到其所在簇\(C_k\)内部的平均距离,反映簇内的局部紧凑性;而\(b_i\)刻画样本\(x_i\)到最近其他簇的平均距离,反映其与邻近簇之间的分离程度。由定义可以看出,\(s_i\)本质上是簇内距离与最近簇间距离之间的相对差异。当\(a_i\ll b_i\)时,样本\(x_i\)位于簇的内部区域,与其他簇之间存在明显间隔,此时\(s_i\)接近\(1\);当\(a_i\approx b_i\)时,样本\(x_i\)位于簇的边界附近,对不同簇的归属不具有明显偏好,此时\(s_i\)接近\(0\);当\(a_i>b_i\)时,样本\(x_i\)在几何意义上更接近其他簇而非当前簇,通常意味着该样本可能被错误分配,此时\(s_i<0\)

因此,Silhouette 系数可被视为一种基于距离比值的局部几何判别准则,它同时综合了簇内紧凑性与簇间分离性,并能够在样本层面反映聚类结构的合理性。

16.6.1.2 外部指标

Definition 16.16. 考虑所有样本对\((i,j)\),定义:

  • \(a\):在真实标签同类,且聚类也同簇的样本对个数;

  • \(b\):在真实标签不同类,且聚类也不同簇的样本对个数;

称:

\[\begin{equation*} \operatorname{RI}=\frac{a+b}{\binom{n}{2}} \end{equation*}\]

Rand 指数(Rand index),称:

\[\begin{equation*} \operatorname{ARI}=\frac{\operatorname{RI}-\operatorname{E}(\operatorname{RI})}{1-\operatorname{E}(\operatorname{RI})} \end{equation*}\]

校正 Rand 指数(adjusted Rand index)

Theorem 16.6. 在固定边际(列联表个数统计值)的情况下,设:

真实类别与聚类簇的列联表
\(L_1\) \(L_2\) \(\cdots\) \(L_r\) 合计
\(C_1\) \(N_{11}\) \(N_{12}\) \(\cdots\) \(N_{1r}\) \(n_1\)
\(C_2\) \(N_{21}\) \(N_{22}\) \(\cdots\) \(N_{2r}\) \(n_2\)
\(\vdots\) \(\vdots\) \(\vdots\) \(\ddots\) \(\vdots\) \(\vdots\)
\(C_K\) \(N_{K1}\) \(N_{K2}\) \(\cdots\) \(N_{Kr}\) \(n_K\)
合计 \(m_1\) \(m_2\) \(\cdots\) \(m_r\) \(n\)

其中\(C_i\)表示第\(i\)个聚类簇,\(L_j\)表示第\(j\)个真实类别,\(N_{ij}=|C_i\cap L_j|\)为同时属于簇\(C_i\)且属于类别\(L_j\)的样本个数,并满足行边际与列边际约束:

\[\begin{equation*} \sum_{j=1}^rN_{ij}=n_i,\quad \sum_{i=1}^KN_{ij}=m_j,\quad \sum_{i=1}^K\sum_{j=1}^rN_{ij}=n \end{equation*}\]

则:

\[\begin{equation*} \operatorname{E}(\operatorname{RI})=1+\frac{2\sum\limits_{i=1}^{K}\binom{n_i}{2}\sum\limits_{j=1}^{r}\binom{m_j}{2}}{[\binom{n}{2}]^2}-\frac{\sum\limits_{i=1}^{K}\binom{n_i}{2}+\sum\limits_{j=1}^{r}\binom{m_j}{2}}{\binom{n}{2}} \end{equation*}\]

证明. 性质 5.4.3(6)可知:

\[\begin{equation*} \operatorname{E}(\operatorname{RI})=\frac{\operatorname{E}(a)+\operatorname{E}(b)}{\binom{n}{2}} \end{equation*}\]

对于\(\operatorname{E}(a)\),根据性质 5.4.3(6)可得写非参数列联表的时候把这边综合起来

\[\begin{equation*} \operatorname{E}(a)=\operatorname{E}\left[\sum_{i=1}^{K}\sum_{j=1}^{r}\binom{N_{ij}}{2}\right]=\sum_{i=1}^{K}\sum_{j=1}^{r}\frac{1}{2}\operatorname{E}[N_{ij}(N_{ij}-1)]=\sum_{i=1}^{K}\sum_{j=1}^{r}\frac{1}{2}[\operatorname{E}(N_{ij}^2)-\operatorname{E}(N_{ij})] \end{equation*}\]

而:

\[\begin{equation*} N_{ij}\sim\operatorname{Hyper}(n_i,m_j,n),\quad\operatorname{E}(N_{ij})=\frac{n_im_j}{n},\quad\operatorname{Var}(N_{ij})=\frac{n_im_j(n-n_i)(n-m_j)}{n^2(n-1)} \end{equation*}\]

性质 6.3.5(1)可知:

\[\begin{align*} &\operatorname{E}(N_{ij}^2)=\operatorname{Var}(N_{ij})+[\operatorname{E}(N_{ij})]^2=\frac{n_im_j(n-n_i)(n-m_j)}{n^2(n-1)}+\frac{n_i^2m_j^2}{n^2} \\ =&\frac{n_im_j(n-n_i)(n-m_j)+n_i^2m_j^2(n-1)}{n^2(n-1)}=\frac{n_im_j[(n-n_i)(n-m_j)+n_im_j(n-1)]}{n^2(n-1)} \\ =&\frac{n_im_j(n^2-m_jn-n_in+n_im_j+n_im_jn-n_im_j)}{n^2(n-1)}=\frac{n_im_j(n^2-m_jn-n_in+n_im_jn)}{n^2(n-1)} \\ =&\frac{n_im_j(n-m_j-n_i+n_im_j)}{n(n-1)} \end{align*}\]

于是:

\[\begin{align*} &\operatorname{E}(N_{ij}^2)-\operatorname{E}(N_{ij})=\frac{n_im_j(n-m_j-n_i+n_im_j)}{n(n-1)}-\frac{n_im_j}{n} \\ =&\frac{n_im_j(n-m_j-n_i+n_im_j)-(n-1)n_im_j}{n(n-1)}=\frac{n_im_j(1-m_j-n_i+n_im_j)}{n(n-1)} \\ =&\frac{n_i(n_i-1)m_j(m_j-1)}{n(n-1)} \end{align*}\]

所以:

\[\begin{equation*} \operatorname{E}(a)=\sum_{i=1}^{K}\sum_{j=1}^{r}\frac{1}{2}\frac{n_i(n_i-1)m_j(m_j-1)}{n(n-1)}=\sum_{i=1}^{K}\sum_{j=1}^{r}\frac{\binom{n_i}{2}\binom{m_j}{2}}{\binom{n}{2}}=\frac{\sum\limits_{i=1}^{K}\binom{n_i}{2}\sum\limits_{j=1}^{r}\binom{m_j}{2}}{\binom{n}{2}} \end{equation*}\]

对于\(\operatorname{E}(b)\),注意到同簇样本个数\(A\)与同类样本个数\(B\)分别为:

\[\begin{equation*} A=\sum_{i=1}^{K}\binom{n_i}{2},\quad B=\sum_{j=1}^{r}\binom{m_j}{2} \end{equation*}\]

于是:

\[\begin{equation*} b=\binom{n}{2}-a-(B-a)-(A-a)=\binom{n}{2}-A-B+a \end{equation*}\]

根据性质 5.4.3(6)可得:

\[\begin{equation*} \operatorname{E}(b)=\binom{n}{2}-A-B+\operatorname{E}(a) \end{equation*}\]

所以:

\[\begin{align*} &\operatorname{E}(\operatorname{RI})=\frac{2\operatorname{E}(a)+\binom{n}{2}-A-B}{\binom{n}{2}}=\frac{2\operatorname{E}(a)}{\binom{n}{2}}+1-\frac{A+B}{\binom{n}{2}} \\ =&1+\frac{2\sum\limits_{i=1}^{K}\binom{n_i}{2}\sum\limits_{j=1}^{r}\binom{m_j}{2}}{[\binom{n}{2}]^2}-\frac{\sum\limits_{i=1}^{K}\binom{n_i}{2}+\sum\limits_{j=1}^{r}\binom{m_j}{2}}{\binom{n}{2}} \end{align*}\]

Property 16.6.3. \(\operatorname{RI}\in[0,1],\;\operatorname{ARI}\leqslant1\)

证明. \(\operatorname{RI}\in[0,1]\)是显然的。

若真实划分与聚类划分不是几乎必然完全一致,则随机生成的聚类结果不可能以概率\(1\)与真实标签完全一致,因此\(\operatorname{E}(\operatorname{RI})<1\)

\(\operatorname{RI}\leqslant1\)可知:

\[\begin{equation*} \operatorname{RI}-\operatorname{E}(\operatorname{RI})\leqslant1-\operatorname{E}(\operatorname{RI}) \end{equation*}\]

由于\(1-\operatorname{E}(\operatorname{RI})>0\),两边同除以\(1-\operatorname{E}(\operatorname{RI})\)可得:

\[\begin{equation*} \operatorname{ARI} =\frac{\operatorname{RI}-\operatorname{E}(\operatorname{RI})}{1-\operatorname{E}(\operatorname{RI})}\leqslant1 \end{equation*}\]

note 16.7. \(\operatorname{RI}\)基于样本对一致性来评价聚类结果,\(\operatorname{RI}\) 越大表示聚类划分与真实标签的一致性越强;若 \(\operatorname{RI}\) 接近 \(1\),说明聚类结果与真实划分高度一致;若接近 \(0\),说明一致性极弱。

为了理解\(\operatorname{RI}\)的统计行为,需要引入随机聚类模型:在该模型中,真实类别个数与各簇规模均被视为固定,而聚类标签在所有满足给定簇规模约束的分配方式中等概率随机生成。该模型刻画了”聚类结果与真实标签在统计意义上相互独立”的基准情形。

在这一随机模型下,\(\operatorname{RI}\)往往具有非零且相对较大的期望值。其根本原因在于样本对中真实不同类的情形通常占据主导地位,而这类样本对在随机聚类中被分配到不同簇的概率本身较高。例如,设\(n=100\),真实标签包含\(10\)个类别、每类\(10\)个样本,则共有\(\binom{100}{2}=4950\)个样本对,其中真实不同类的样本对数为\(4500\)。即使聚类结果完全随机,只要簇规模与真实类别规模相近,大多数真实异类样本对仍会落入不同簇,从而使得 \(\operatorname{RI}\)取得看似较好的数值。这表明\(\operatorname{RI}\)对随机一致性并不敏感。

\(\operatorname{ARI}\)正是基于上述随机模型对\(\operatorname{RI}\)进行期望校正,该校正保证了随机聚类的期望\(\operatorname{ARI}\)\(0\),完美一致时取值为\(1\),并允许在一致性劣于随机时取负值。因此,\(\operatorname{ARI}\)相较于\(\operatorname{RI}\)提供了一个以随机一致性为基准的、更为稳健的外部聚类评价指标。

Definition 16.17. 考虑所有样本对\((i,j)\),定义:

  • \(TP\):真实标签同类,且聚类结果同簇的样本对数;

  • \(FP\):真实标签不同类,但聚类结果同簇的样本对数;

  • \(FN\):真实标签同类,但聚类结果不同簇的样本对数。

称:

\[\begin{equation*} \operatorname{FMI} =\sqrt{ \frac{TP}{TP+FP} \cdot \frac{TP}{TP+FN} } \end{equation*}\]

Fowlkes-Mallows 指数(Fowlkes-Mallows index)

Property 16.6.4. \(\operatorname{FMI}\in[0,1]\)

证明. 由定义立即可得。 ◻

note 16.8. Fowlkes-Mallows指数从样本对一致性的角度同时兼顾了聚类结果的精确性与完整性。在真实标签给定的条件下,\(\operatorname{FMI}\)越大表示聚类结果与真实划分在样本对层面上的一致性越强;当聚类结果与真实标签完全一致时,\(\operatorname{FMI}=1\);当不存在任何同类同簇的样本对时,\(\operatorname{FMI}=0\)。与\(\operatorname{RI}\)将异类异簇样本对也视为正确判断不同,\(\operatorname{FMI}\)仅关注真实同类样本是否被成功聚合,从而在类别数量较多或类别规模不平衡的情形下,往往比 RI 更为保守。

16.6.2 K-means

算法 16.3 K-means Clustering (Lloyd’s Algorithm)

输入: Data points \(X=\{x_n\}_{i=1}^{n}\subseteq\mathbb{R}^m\); number of clusters \(K\); maximum number of iterations \(T\); tolerance \(\varepsilon\)

输出: Cluster assignments \(\{C_1,\dots,C_K\}\); centroids \(\{\mu_1,\dots,\mu_K\}\)

Select the first centroid \(\mu_1\) uniformly at random from \(X\)

(Initialization step)

for \(k=2\) to \(K\) do

for each data point \(x_i \in \mathcal{X}\) do

\(D_i^2 \gets \min\limits_{1\leqslant j < k} \|x_i - \mu_j\|^2\)

end for

Select \(\mu_k\) from \(X\) with probability

\[ P(x_i) = \frac{D_i^2}{\sum\limits_{j=1}^n D_j^2} \]

end for

for \(t=1\) to \(T\) do

(Assignment step)

for each data point \(x_i\in X\) do

\(y_i \gets \underset{k=1,2,\dots,K}{\arg\min}\|x_i-\mu_k\|^2\), assign \(x_i\) to cluster \(C_{y_i}\)

end for

for \(k=1\) to \(K\) do

(Update step)

\(\mu_k^{\text{new}} \gets \dfrac{1}{|C_k|} \sum\limits_{x_i\in C_k} x_i\)

end for

if \(\max\limits_{k} \|\mu_k^{\text{new}}-\mu_k\| < \varepsilon\) then

break

end if

\(\mu_k \gets \mu_k^{\text{new}},\;\forall\;k=1,\dots,K\)

end for

算法 16.3给出了经典的K-means聚类算法(亦称Lloyd算法)的完整流程。该算法的目标是在给定样本集合的情况下,将样本划分为\(K\)个互不相交的簇,使得簇内样本在欧氏距离意义下尽可能紧密。从优化角度看,K-means试图最小化如下的类内平方和目标函数:

\[\begin{equation*} \Phi(\{\mu_k\},\{C_k\})=\sum_{k=1}^K\sum_{x_i\in C_k}\|x_i-\mu_k\|^2 \end{equation*}\]

由于每一次分配或更新步骤都会使目标函数\(\Phi\)的值非增平方分解均值最小,下面两个算法也需要链接,且\(\Phi\)在下界零处有界,根据性质 3.2.9(7)可知K-means算法在有限步内必然收敛到某一局部最优解。然而,由于目标函数是非凸的证明,算法的最终结果依赖于初始中心的选取,这也是在实际应用中通常采用k-means++初始化(即算法 16.3中的1-7步)而非完全随机初始化的原因。

16.6.2.1 K-modes

算法 16.4 K-modes Clustering Algorithm with Cao Initialization

输入: Categorical data \(X=\{x_i\}_{i=1}^n\), where \(x_i=(x_{i1},\dots,x_{ip})\); number of clusters \(K\); maximum number of iterations \(T\)

输出: Cluster assignments \(\{C_1,\dots,C_K\}\); modes \(\{m_1,\dots,m_K\}\)

For each categorical variable \(j=1,\dots,p\), let \(\mathcal C_j\) denote its set of possible categories. For each \(c\in\mathcal C_j\), compute

\[ f_j(c) = \frac{1}{n} \sum_{i=1}^n I(x_{ij}=c) \]

Define sample density: \(\mathrm{dens}(x_i)=\sum\limits_{j=1}^p f_j(x_{ij})\)

Select the first mode: \(m_1 \gets \underset{x_i\in X}{\arg\max}\;\mathrm{dens}(x_i)\)

for \(k=2\) to \(K\) do

Select

\[ m_k \gets \underset{x_i\in X}{\arg\max} \Bigl( \mathrm{dens}(x_i)\cdot \min_{1\leqslant r<k}\sum_{j=1}^p I(x_{ij}\neq m_{rj}) \Bigr) \]

end for

for \(t=1\) to \(T\) do

(Assignment step)

for each data point \(x_i\in X\) do

\(y_i \gets \underset{k=1,2,\dots,K}{\arg\min} \sum\limits_{j=1}^p I(x_{ij}\neq m_{kj})\), assign \(x_i\) to cluster \(C_{y_i}\)

end for

for \(k=1\) to \(K\) do

(Update step)

for \(j=1\) to \(p\) do

\(m_{kj} \gets \operatorname{mode}\{x_{ij}:x_i\in C_k\}\)

end for

end for

if cluster assignments do not change then

break

end if

end for

算法 16.4 给出了K-modes聚类算法的标准形式。该算法专门用于处理分类型数据,其目标是在简单匹配不相似度下最小化类内不一致性。对应的优化目标函数为:

\[\begin{equation*} \Psi({m_k},{C_k})= \sum_{k=1}^K\sum_{x_i\in C_k}\sum_{j=1}^p I(x_{ij}\neq m_{kj}) \end{equation*}\]

该目标函数在簇分配或逐维众数更新时均单调不增,因此算法在有限步内收敛到某一局部最优解。与K-means类似,由于目标函数的非凸性,K-modes的结果依赖于初始化方式,实际应用中通常采用Cao初始化(即算法 16.4中的1-6步)。

Cao初始化的核心思想在于:初始聚类原型应当同时具备代表性和区分性。具体而言,算法首先通过各分类变量的经验频率刻画样本在全体数据中的密度,从而选取在每一维上均取高频类别的样本作为第一个初始中心,该样本可被视为总体经验分布下的一个典型点。随后,在选取其余初始中心时,Cao初始化在保证中心密度较高的同时,引入与已有中心之间的简单匹配不相似度,以避免多个初始原型集中于同一高频区域。

16.6.2.2 K-prototypes

算法 16.5 K-prototypes Clustering Algorithm

输入: Mixed-type data \(X=\{x_i=(x_i^{(n)},x_i^{(c)})\}_{i=1}^n\); number of clusters \(K\); trade-off parameter \(\gamma>0\); maximum number of iterations \(T\)

输出: Cluster assignments \(\{C_1,\dots,C_K\}\); prototypes \(\{(\mu_k,m_k)\}_{k=1}^K\)

(Initialization step)

Initialize numerical prototypes \(\mu_1,\dots,\mu_K\) by applying K-means++ initialization

Initialize categorical prototypes \(m_1,\dots,m_K\) by applying Cao initialization

for \(t=1\) to \(T\) do

(Assignment step)

for each data point \(x_i\in X\) do

\(y_i \gets \underset{k=1,2,\dots,K}{\arg\min} \Big( \|x_i^{(n)}-\mu_k\|^2 + \gamma\sum\limits_{j=1}^q I(x_{ij}^{(c)}\neq m_{kj}) \Big)\), assign \(x_i\) to cluster \(C_{y_i}\)

end for

for \(k=1\) to \(K\) do

(Update step)

\(\mu_k \gets \dfrac{1}{|C_k|} \sum\limits_{x_i\in C_k} x_i^{(n)}\)

for \(j=1\) to \(\dim(x_i^{(c)})\) do

\(m_{kj} \gets \operatorname{mode}\{x_{ij}^{(c)}:x_i\in C_k\}\)

end for

end for

if cluster assignments do not change then

break

end if

end for

算法 16.5 描述了K-prototypes聚类算法的完整流程。该算法同时处理数值型与分类型变量,其优化目标为:

\[\begin{equation*} \Omega({\mu_k,m_k},{C_k})= \sum_{k=1}^K\sum_{x_i\in C_k} \Big(\|x_i^{(n)}-\mu_k\|^2 + \gamma\sum_{j=1}^{\dim(x_i^{(c)})} I(x_{ij}^{(c)}\neq m_{kj})\Big) \end{equation*}\]

其中参数\(\gamma\)用于平衡数值误差与分类型不匹配误差的相对尺度,实践中,通常在对数值型变量进行标准化处理后,根据数值型与分类型变量的维数比例设置\(\gamma\approx p/q\),其中\(p\)\(q\)分别表示数值型与分类型变量的维数。与 K-means和K-modes 类似,K-prototypes通过交替最小化策略保证目标函数单调下降,但最终仅能保证收敛到局部最优解。

16.6.3 凝聚型层次聚类

算法 16.6 Agglomerative Hierarchical Clustering

输入: Data points \(X=\{x_i\}_{i=1}^{n}\subseteq\mathbb{R}^m\); linkage criterion \(L\); distance metric \(\rho(\cdot,\cdot)\); target number of clusters \(K\) or distance threshold \(h_0\)

输出: Cluster assignments \(\{C_1,\dots,C_{K}\}\); merge history (dendrogram)

Initialize clusters \(C_i \gets \{x_i\}\) for \(i=1,\dots,n\)

Compute initial pairwise dissimilarities \(D_L(C_p,C_q)\)

while stopping criterion not satisfied do

\((p,q)\gets \underset{p\neq q}{\arg\min}D_L(C_p,C_q)\)

if \(D_L(C_p,C_q) > h_0\) then

break

end if

Merge clusters \(C_p\) and \(C_q\) into \(C_{\text{new}}\)

Record merge height \(D_L(C_p,C_q)\)

Remove \(C_p,C_q\) and add \(C_{\text{new}}\)

Update dissimilarities involving \(C_{\text{new}}\)

if number of clusters \(= K\) then

break

end if

end while

算法 16.6给出了凝聚型层次聚类(agglomerative hierarchical clustering)的基本流程。算法从最细粒度的划分开始,将每一个样本视为一个单独的簇。随后,在当前簇集合中,根据预先选定的簇间距离准则(linkage criterion),反复选择距离最近的两个簇并将其合并。该合并过程持续进行,直到簇的数量减少至预先指定的目标簇数\(K\),或最小簇间距离大于给定值\(h_0\)

层次聚类的核心在于如何定义两个簇之间的距离。设\(A,B\subseteq X\)为两个簇,\(\rho\) 为样本空间中的距离度量,则簇间距离\(D_L(A,B)\)由 linkage 准则给出。不同的 linkage 定义对应着不同的几何偏好与聚类行为。

常见的 linkage 定义如下:

  1. 单链接(Single linkage):\(D_{\text{single}}(A,B)=\min\limits_{x\in A,\,y\in B} \rho(x,y)\)

  2. 全链接(Complete linkage):\(D_{\text{complete}}(A,B)=\max\limits_{x\in A,\,y\in B} \rho(x,y)\)

  3. 平均链接(Average linkage):\(D_{\text{average}}(A,B)=\dfrac{1}{|A||B|}\sum\limits_{x\in A}\sum\limits_{y\in B}\rho(x,y)\)

  4. Ward 方法(Ward linkage): \(\Delta(A,B)=\operatorname{SSE}(A\cup B)-\operatorname{SSE}(A)-\operatorname{SSE}(B)\),Ward 方法并不直接基于样本对距离,而是选择使合并后类内平方和增量最小的两个簇。

16.6.4 DBSCAN

算法 16.7 DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

输入: Data points \(X=\{x_i\}_{i=1}^{n}\subseteq\mathbb{R}^m\); neighborhood radius \(\varepsilon\); minimum number of points \(\operatorname{MinPts}\)

输出: Cluster assignments \(\{C_1,\dots,C_K\}\); noise set \(\mathcal{N}\)

Mark all points as unvisited

\(K \gets 0\), \(\mathcal{N}\gets\varnothing\)

for each point \(x_i\in X\) do

if \(x_i\) is visited then

continue

end if

Mark \(x_i\) as visited; \(U(x_i,\varepsilon)\gets\{x_j\in X:\rho(x_j,x_i)\leqslant\varepsilon\}\)

if \(|U(x_i,\varepsilon)|<\operatorname{MinPts}\) then

Label \(x_i\) as noise; \(\mathcal{N}\gets\mathcal{N}\cup\{x_i\}\)

else

\(K\gets K+1\); Create new cluster \(C_K\) and add \(x_i\) to \(C_K\)

\(S\gets U(x_i,\varepsilon)\setminus\{x_i\}\)

while \(S\ne \varnothing\) do

Select \(x_p\in S\) and remove it from \(S\)

if \(x_p\) is not visited then

Mark \(x_p\) as visited; \(U(x_p,\varepsilon)\gets\{x_j\in X:\rho(x_j,x_p)\leqslant\varepsilon\}\)

if \(|U(x_p,\varepsilon)|\geqslant\operatorname{MinPts}\) then

\(S\gets S\cup[U(x_p,\varepsilon)\setminus\{x_p\}]\)

end if

end if

if \(x_p\) has not been assigned to any cluster then

Add \(x_p\) to \(C_K\); \(\mathcal{N}\gets\mathcal{N}\setminus\{x_p\}\)

end if

end while

end if

end for

算法 16.7给出了DBSCAN算法的完整流程。与基于中心的K-means不同,DBSCAN不依赖簇中心或簇数量的预先设定,而是通过样本在空间中的密度分布来刻画簇结构。

给定半径参数\(\varepsilon\)与最小点数阈值\(\operatorname{MinPts}\),定义点\(x_i\)\(\varepsilon\)-邻域为:

\[\begin{equation*} U(x_i,\varepsilon)=\{x_j\in X:\|x_j-x_i\|\leqslant\varepsilon\} \end{equation*}\]

\(|U(x_i,\varepsilon)|\geqslant\operatorname{MinPts}\),则称\(x_i\)为核心点;若点本身不是核心点,但位于某一核心点的\(\varepsilon\)-邻域内,则称其为边界点;其余点被视为噪声。

DBSCAN中的点类型与邻域扩张。虚线圆表示以核心点c1, c2为中心的ε-邻域。

DBSCAN首先将所有样本标记为未访问,并依次选择尚未访问的样本\(x_i\)作为考察对象。算法访问\(x_i\)后,首先判断\(x_i\)是否为核心点,若\(x_i\)非核心点,此时算法暂时将\(x_i\)标记为噪声点。这里的噪声标记并不是最终结论:若后续从其他核心点扩张簇时发现\(x_i\)位于该核心点的\(\varepsilon\)-邻域内,则\(x_i\)仍会被吸收到相应簇中,并作为边界点从噪声集合中移除。

\(x_i\)是核心点,算法以\(x_i\)为起点创建一个新簇,并将其邻域中的其他样本加入待处理集合\(S\)。随后,算法不断从\(S\)中取出一个样本\(x_p\)进行检查。若\(x_p\)尚未被访问,则先将其标记为已访问,并计算其邻域\(U(x_p,\varepsilon)\)。当\(x_p\)同样满足\(|U(x_p,\varepsilon)|\geqslant\operatorname{MinPts}\)时,说明\(x_p\)也是核心点,因此其邻域中的样本均可能通过\(x_p\)与当前簇邻域可达,算法便将这些样本继续加入\(S\),从而使当前簇沿着相邻核心点逐步向外扩张。若\(x_p\)不是核心点,则其邻域不会被继续展开,但只要\(x_p\)尚未被分配给其他簇,它仍会作为边界点加入当前簇。

上述过程持续进行,直到待处理集合\(S\)为空。此时,所有能够由起始核心点通过有限条直接密度可达关系到达的核心点,以及附着在这些核心点邻域中的边界点,均已被纳入当前簇,因此该簇不能再继续扩张。算法随后返回外层循环,继续选择下一个尚未访问的样本,并以相同方式判断其是否能够形成新的簇。全部样本处理完毕后,仍未被任何簇吸收的点最终构成噪声集合。

note 16.9. 在实际应用中,通常先根据数据维数选择\(\operatorname{MinPts}\)。若数据的有效维数为\(d_{\mathrm{eff}}\),一个常用的经验选择为:

\[\begin{equation*} \operatorname{MinPts}\approx 2d_{\mathrm{eff}} \end{equation*}\]

在给定\(\operatorname{MinPts}\)后,可以利用\(k\)-distance图选择\(\varepsilon\)。计算每个点到其第\(\operatorname{MinPts}\)个最近邻的距离\(d_k(x_i)\),该距离表示使\(x_i\)的邻域刚好包含足够多样本、从而满足核心点条件所需要的最小半径。将所有\(d_k(x_i)\)从小到大排序后,簇内部的高密度点通常对应较小且变化平缓的距离,而边界点和噪声点通常对应快速增大的距离。因此,可以将排序曲线由平缓转为快速上升的拐点所对应的距离作为\(\varepsilon\)的候选值。

需要特别注意的是,DBSCAN在整个数据集上使用同一个\(\varepsilon\)和同一个 \(\operatorname{MinPts}\),因而隐含地使用一个全局统一的密度阈值。若不同簇具有明显不同的密度水平,则通常不存在一个同时适合所有簇的\(\varepsilon\)。较小的\(\varepsilon\)能够识别高密度簇,但可能将低密度部分划为噪声;较大的 \(\varepsilon\) 虽然能够保留低密度簇,却可能通过一系列邻域可达点将原本不同的高密度簇错误连接。因此,当数据包含密度水平显著不同的簇时,参数选择困难并不一定只是调参问题,而可能反映了标准 DBSCAN 的模型假设不适合该数据。 同时,边界点的归属可能依赖于簇的扩张顺序。若某个非核心点同时位于两个不同核心簇的核心点的\(\varepsilon\)-邻域中,则它可以从两个簇中的核心点邻域可达,但自身不能继续扩张并连接这两个核心区域。按照算法 16.7,该边界点被归入第一个扩张到它的簇。

由于DBSCAN能够识别任意形状的簇并显式区分噪声点,其在处理非凸簇结构时具有显著优势。然而,算法对参数\(\varepsilon\)\(\operatorname{MinPts}\)较为敏感,且在高维空间中邻域查询的效率可能显著下降,这在一定程度上限制了其适用范围。

16.6.5 OPTICS

算法 16.8 OPTICS (Ordering Points To Identify the Clustering Structure)

输入: Data points \(X=\{x_i\}_{i=1}^{n}\subseteq\mathbb{R}^m\); maximum neighborhood radius \(\varepsilon_{\max}\); minimum number of points \(\operatorname{MinPts}\)

输出: Cluster ordering \(\mathcal{O}\); reachability distances \(\{d_{\text{reach}}(x_i)\}\)

Mark all points as unprocessed

Initialize \(d_{\text{reach}}(x_i)\gets +\infty\) for all \(x_i\) and empty ordering list \(\mathcal{O}\)

for each point \(x_i\in X\) do

if \(x_i\) is processed then

continue

end if

Compute neighborhood \(U(x_i,\varepsilon_{\max})\); Mark \(x_i\) as processed; Append \(x_i\) to \(\mathcal{O}\)

if \(|U(x_i,\varepsilon_{\max})|\geqslant\operatorname{MinPts}\) then

Compute \(d_{\text{core}}(x_i)=\text{distance to the $\operatorname{MinPts}$-th nearest neighbor of }x_i\)

Initialize empty priority queue \(S\)

for each unprocessed point \(x_j\in U(x_i,\varepsilon_{\max})\) do

\(d_{\text{new}} \gets \max\{d_{\text{core}}(x_i),\,\rho(x_i,x_j)\}\)

\(d_{\text{reach}}(x_j) \gets \min\{d_{\text{reach}}(x_j),\,d_{\text{new}}\}\)

Insert \(x_j\) in \(S\) with key \(d_{\text{reach}}(x_j)\)

end for

while \(S\ne \varnothing\) do

Extract \(x_p\) with smallest \(d_{\text{reach}}(x_p)\) from \(S\)

Compute neighborhood \(U(x_p,\varepsilon_{\max})\)

Mark \(x_p\) as processed; Append \(x_p\) to \(\mathcal{O}\)

if \(|U(x_p,\varepsilon_{\max})|\geqslant\operatorname{MinPts}\) then

Compute \(d_{\text{core}}(x_p)\)

for each unprocessed point \(x_q\in U(x_p,\varepsilon_{\max})\) do

\(d_{\text{new}} \gets \max\{d_{\text{core}}(x_p),\,\rho(x_p,x_q)\}\)

\(d_{\text{reach}}(x_q) \gets \min\{d_{\text{reach}}(x_q),\,d_{\text{new}}\}\)

Insert or update \(x_q\) in \(S\) with key \(d_{\text{reach}}(x_q)\)

end for

end if

end while

end if

end for

算法 16.8 给出了OPTICS的完整计算过程。OPTICS与DBSCAN使用相同的局部密度概念,但二者处理邻域半径的方式不同。DBSCAN预先固定半径\(\varepsilon\),并据此直接判断样本之间是否邻域可达;OPTICS则只给定一个足够大的搜索半径\(\varepsilon_{\max}\),在一次遍历中记录各样本能够以多大的距离尺度接入当前邻域区域,从而保留所有不超过\(\varepsilon_{\max}\)的潜在聚类结构。

OPTICS首先判断点\(x_i\)处的局部密度是否足够大(\(|U(x_i,\varepsilon_{\max})|\geqslant\operatorname{MinPts}\)),当局部密度足够大时,视\(x_i\)为核心点,可将\(x_i\)作为密度扩张的起点,否则不可将其作为密度扩张的起点。

\(x_i\)为核心点时,利用核心距离(core distance)描述\(x_i\)附近达到\(\operatorname{MinPts}\)所要求的局部密度尺度。核心距离越小,说明在越小的邻域半径内便可以聚集至少\(\operatorname{MinPts}\)个样本,即\(x_i\)所处区域的局部密度越高。接着使用可达距离(reachability distance)衡量所有邻域样本\(x_j\)接入以\(x_i\)为中心的密度区域所需的距离尺度。一方面,邻域半径至少必须达到\(d_{\mathrm{core}}(x_i)\),否则\(x_i\)本身尚未形成满足\(\operatorname{MinPts}\)要求的稠密邻域;另一方面,邻域半径还必须覆盖\(x_i\)\(x_j\)之间的实际距离。因此,\(d_{\mathrm{reach}}(x_j\mid x_i)\)可以理解为:若以\(x_i\)作为已经进入的核心点,至少需要将密度尺度扩大到多大,才能使\(x_j\)被该密度区域吸收。

完成对核心点\(x_i\)邻域样本的可达距离计算后,OPTICS从所有已经获得有限可达距离但尚未处理的样本中选择当前可达距离最小的样本\(x_p\),将\(x_p\)标记为已处理,并将其加入输出排序\(\mathcal{O}\)。随后,算法判断\(x_p\)是否为核心点。若\(x_p\)不是核心点,则它不能继续向外扩张,算法重新从当前候选集合中选择可达距离最小的未处理样本。若\(x_p\)是核心点,则利用\(x_p\)重新计算其邻域内尚未处理样本的候选可达距离。因此,第一次由起始核心点\(x_i\)展开邻域时,所有邻域样本都是首次获得有限可达距离;而在后续扩张过程中,同一样本可能被多个核心点触及,其可达距离会随着更紧密的密度连接被发现而不断减小。

OPTICS不断重复”选择当前可达距离最小的样本、判断其是否能够继续扩张、更新其邻域样本的可达距离”这一过程,直到不存在具有有限可达距离的未处理样本。此时,从当前起始点出发能够在\(\varepsilon_{\max}\)范围内连接到的密度区域已经处理完毕,算法再从剩余未处理样本中选择新的起点,开始下一轮扩张。

通过不断重复这一过程,最终所有样本均被处理,得到完整的样本排序:

\[\begin{equation*} \mathcal{O}=\left(x_{(1)},x_{(2)},\dots,x_{(n)}\right) \end{equation*}\]

以及与排序位置对应的可达距离序列:

\[\begin{equation*} d_{\mathrm{reach}}(x_{(1)}),d_{\mathrm{reach}}(x_{(2)}),\dots,d_{\mathrm{reach}}(x_{(n)}) \end{equation*}\]

按照排序\(\mathcal{O}\)绘制可达距离即可得到可达距离图。进入一个新的聚类区域时,最初的样本通常尚不能由先前区域到达,因此其可达距离较大或者为无穷大;当算法开始在该区域内部扩张后,后续样本可以在较小尺度下依次被吸收,于是形成连续的低可达距离区间。当算法从一个高密度区域跨越稀疏区域进入另一个聚类区域时,可达距离会显著升高。因此,可达距离图中的一个”谷地”通常对应一个潜在聚类:谷底越低,表示该区域的密度越高;谷地越宽,表示该密度区域包含的样本越多;谷地之间的高峰则反映不同密度区域之间的稀疏间隔。给定任意阈值\(\varepsilon'\leqslant\varepsilon_{\max}\),可以在可达距离图中将可达距离不超过\(\varepsilon'\)的连续区间提取为聚类。在相同\(\operatorname{MinPts}\)和邻域半径\(\varepsilon'\)下,这一提取过程可以恢复相应的DBSCAN聚类结果。因此,更准确地说,OPTICS的输出是一种能够支持提取多个不同\(\varepsilon'\)下DBSCAN聚类结果的密度排序表示。

OPTICS的优势由此变得很明确:DBSCAN只能在预先选定的单一\(\varepsilon\)下观察数据,而OPTICS通过记录样本的处理顺序和可达距离,将不同距离尺度下的密度连接关系压缩到同一个排序中。当不同簇的密度差异很大时,OPTICS可以根据可达距离图的局部谷地结构设置多个\(\varepsilon'\)来识别不同密度水平下的聚类。

note 16.10. 为了达成上述目的,我们需要控制\(\varepsilon_{\max}\)。若\(\varepsilon_{\max}\)过小,某些样本的邻域中可能无法包含至少\(\operatorname{MinPts}\)个样本,使其不能作为核心点继续扩张。即使样本本来属于同一个较低密度聚类,局部连接也可能由于超出\(\varepsilon_{\max}\)而被截断。此时,当前扩张会较早结束,算法需要频繁从剩余的未处理样本中选择新的起点。因此,同一个潜在聚类可能在排序中被拆分成多个扩张片段,并在可达距离序列中产生额外的\(+\infty\)或较大的跳跃。

\(\varepsilon_{\max}\)较大,一次扩张可以覆盖更完整的密度连接结构,算法通常不需要频繁重新选择起点。不同聚类中的样本虽然可能同时位于搜索范围内,但OPTICS始终优先处理当前可达距离较小的样本,因此高密度聚类内部的样本仍会倾向于连续出现,而跨越不同聚类时会产生较大的可达距离。也就是说,较大的\(\varepsilon_{\max}\)一般不会像DBSCAN中过大的\(\varepsilon\)那样直接将所有聚类合并,而是会将不同聚类之间的分隔表现为可达距离图中的高峰。但是,\(\varepsilon_{\max}\)过大会显著增加计算开销,每次邻域搜索与可达距离更新都会涉及过多样本。

因此,\(\varepsilon_{\max}\)应当被设置为一个足够宽松但不过度扩张的上界:它应当大于所有感兴趣聚类内部维持密度连通所需的距离尺度,以避免聚类结构被人为截断;同时又不必大到使每个样本的邻域接近整个数据集。

Method 16.3. \(\xi\)聚类提取)

记OPTICS排序为:

\[\begin{equation*} \mathcal{O}=\left(x_{(1)},x_{(2)},\ldots,x_{(n)}\right) \end{equation*}\]

并记对应的可达距离序列为:

\[\begin{equation*} r_k=d_{\mathrm{reach}}\left(x_{(k)}\right),\quad k=1,\ldots,n \end{equation*}\]

给定参数\(\xi\in(0,1)\),若:

\[\begin{equation*} r_{k+1}\leqslant(1-\xi)r_k \end{equation*}\]

则称从位置\(k\)到位置\(k+1\)发生一次\(\xi\)-陡降,即可达距离至少相对下降了\(\xi\)。该位置可能对应聚类谷地的入口。

若:

\[\begin{equation*} r_k\leqslant(1-\xi)r_{k+1} \end{equation*}\]

则称从位置\(k\)到位置\(k+1\)发生一次\(\xi\)-陡升,即可达距离发生了足够明显的相对上升。该位置可能对应聚类谷地的出口。

连续的\(\xi\)-陡降区域与其后匹配的\(\xi\)-陡升区域之间形成一个候选谷地。若该区间包含的样本数不少于\(\operatorname{MinPts}\),并且区间内部的可达距离明显低于两侧边界,则将该区间对应的样本提取为一个簇。不属于任何簇的样本被标记为异常点。

参数\(\xi\)越小,算法对较缓的谷地边界越敏感;参数\(\xi\)越大,只有边界变化更加明显的谷地才会被识别。

实践中,可以先取\(\xi=0.05\)作为基准,这也是scikit-learn当前实现中的默认值。随后,可以考察:

\[\begin{equation*} \xi\in\{0.03,0.05,0.10,0.15\} \end{equation*}\]

时聚类提取结果的稳定性。若较小的\(\xi\)使结果被切分为大量规模很小的聚类,说明算法对可达距离图中的局部波动过于敏感,此时可以适当增大\(\xi\);若可达距离图中较为明显的浅谷未被提取,则可以适当减小\(\xi\)


  1. 若特征多项式有重根,则标准正交化特征向量组不唯一,主成分也不唯一。↩︎

  2. 样本因子分析时需要注意使用协方差矩阵的无偏估计。↩︎

COMPUTATIONAL NOTES

计算实验

实验01

K-means

Python · Jupyter

K-means 聚类:用多种指标选择簇数

本实验使用 scikit-learn 完成 K-means 聚类。主要观察两个问题:

  1. 不同评价指标如何帮助选择簇数 K
  2. 聚类结果如何随 K 的增加而变化。
import matplotlib.pyplot as plt
from matplotlib_inline.backend_inline import InlineBackend
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import (
    adjusted_rand_score,
    calinski_harabasz_score,
    fowlkes_mallows_score,
    rand_score,
    silhouette_score,
)
from sklearn.preprocessing import StandardScaler

plt.style.use("seaborn-v0_8-whitegrid")
InlineBackend.instance().print_figure_kwargs = {"bbox_inches": None}
SINGLE_FIGSIZE = (8, 5.5)

1. 生成并标准化数据

生成三个近似球形的二维簇。变量 y_true 只用于演示外部评价指标,不参与 K-means 拟合。

X, y_true = make_blobs(
    n_samples=360,
    centers=[(-4, -1), (0, 4), (4, -2)],
    cluster_std=[0.85, 1.00, 0.90],
    random_state=42,
)
X_scaled = StandardScaler().fit_transform(X)

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE)
ax.scatter(X_scaled[:, 0], X_scaled[:, 1], s=24, alpha=0.75, color="#4C78A8")
ax.set(title="Standardized samples", xlabel="Feature 1", ylabel="Feature 2")
plt.show()

2. 计算全部评价指标

K = 1, 2, …, 8 分别拟合 K-means。WCSS 使用肘部位置判断;CH、Silhouette、RI、ARI 和 FMI 均取较大值。

CH 与 Silhouette 是内部指标,只依赖样本和聚类标签。RI、ARI 与 FMI 是外部指标,需要已知真实标签,因此在实际无监督任务中通常不能用于选择 K

all_k = range(1, 9)
candidate_k = range(2, 9)
models = {}
rows = []

for k in all_k:
    model = KMeans(n_clusters=k, init="k-means++", n_init=20, random_state=42)
    labels = model.fit_predict(X_scaled)
    models[k] = model

    if k >= 2:
        rows.append(
            {
                "K": k,
                "WCSS": model.inertia_,
                "CH": calinski_harabasz_score(X_scaled, labels),
                "Silhouette": silhouette_score(X_scaled, labels),
                "RI": rand_score(y_true, labels),
                "ARI": adjusted_rand_score(y_true, labels),
                "FMI": fowlkes_mallows_score(y_true, labels),
            }
        )

metrics = pd.DataFrame(rows).set_index("K")
metrics.round(3)
WCSS CH Silhouette RI ARI FMI
K
2 346.953 384.926 0.551 0.777 0.570 0.773
3 64.141 1825.206 0.755 1.000 1.000 1.000
4 55.314 1426.270 0.622 0.947 0.874 0.916
5 46.982 1271.359 0.481 0.889 0.728 0.816
6 39.308 1226.049 0.364 0.838 0.582 0.714
7 33.877 1191.580 0.368 0.818 0.525 0.672
8 30.578 1133.772 0.345 0.796 0.456 0.620

3. 比较指标曲线

WCSS 在 K = 3 附近由陡降转为平缓。其余指标的黑点表示各自的最大值。

chosen_k = 3
wcss = [models[k].inertia_ for k in all_k]
fig, axes = plt.subplots(2, 3, figsize=(14, 8), constrained_layout=True)

axes[0, 0].plot(list(all_k), wcss, marker="o", color="#E45756")
axes[0, 0].scatter(chosen_k, wcss[chosen_k - 1], s=90, color="#111827", zorder=3)
axes[0, 0].annotate("elbow", (chosen_k, wcss[chosen_k - 1]), xytext=(8, 8), textcoords="offset points")
axes[0, 0].set(title="WCSS (elbow)", xlabel="K", ylabel="WCSS", xticks=list(all_k))

for ax, metric, color in zip(
    axes.flat[1:],
    ["CH", "Silhouette", "RI", "ARI", "FMI"],
    ["#4C78A8", "#59A14F", "#F28E2B", "#B279A2", "#76B7B2"],
):
    values = metrics[metric]
    best_k = int(values.idxmax())
    ax.plot(values.index, values, marker="o", color=color)
    ax.scatter(best_k, values.loc[best_k], s=90, color="#111827", zorder=3)
    ax.annotate(f"max at K = {best_k}", (best_k, values.loc[best_k]), xytext=(8, 8), textcoords="offset points")
    ax.set(title=metric, xlabel="K", ylabel=metric, xticks=list(candidate_k))

plt.show()

4. 查看每一个 K 的聚类结果

下图依次展示 K = 1, 2, …, 8 的划分。星号表示簇中心。随着 K 增大,原有样本群会被进一步拆分。

fig, axes = plt.subplots(2, 4, figsize=(15, 7.5), sharex=True, sharey=True, constrained_layout=True)
colors = plt.get_cmap("tab10")

for ax, k in zip(axes.flat, all_k):
    model = models[k]
    labels = model.labels_
    for label in range(k):
        points = X_scaled[labels == label]
        ax.scatter(points[:, 0], points[:, 1], s=14, alpha=0.72, color=colors(label))
    ax.scatter(
        model.cluster_centers_[:, 0],
        model.cluster_centers_[:, 1],
        marker="*",
        s=150,
        color="#111827",
        edgecolor="white",
        linewidth=0.8,
    )
    title = f"K = {k}" + ("  selected" if k == chosen_k else "")
    ax.set_title(title, fontweight="bold" if k == chosen_k else "normal")
    ax.set_xlabel("Feature 1")
    ax.set_ylabel("Feature 2")

plt.show()

观察

本例中,各项指标都支持 K = 3。当 K < 3 时,彼此分离的样本群被合并;当 K > 3 时,已有样本群被人为拆分。实际数据没有真实标签时,应主要结合 WCSS、CH、Silhouette 和聚类图作出判断。

实验02

凝聚型层次聚类

Python · Jupyter

凝聚型层次聚类

本实验使用与 K-means 实验相同的数据。主要观察Ward 凝聚法如何从单个样本出发,逐步合并为完整的层次树。

import matplotlib.pyplot as plt
from matplotlib_inline.backend_inline import InlineBackend
import numpy as np
from scipy.cluster.hierarchy import dendrogram
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler

plt.style.use("seaborn-v0_8-whitegrid")
InlineBackend.instance().print_figure_kwargs = {"bbox_inches": None}
SINGLE_FIGSIZE = (8, 5.5)

1. 生成并标准化数据

数据的样本量、中心、离散程度和随机种子均与 K-means 实验相同。

X, _ = make_blobs(
    n_samples=360,
    centers=[(-4, -1), (0, 4), (4, -2)],
    cluster_std=[0.85, 1.00, 0.90],
    random_state=42,
)
X_scaled = StandardScaler().fit_transform(X)

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE)
ax.scatter(X_scaled[:, 0], X_scaled[:, 1], s=24, alpha=0.75, color="#4C78A8")
ax.set(title="Standardized samples", xlabel="Feature 1", ylabel="Feature 2")
plt.show()

2. 展示逐步合并过程

树状图底部每个叶节点表示一个样本;每个分叉连接表示两个簇被合并;最上方只剩一个包含全部样本的簇。虚线是产生 3 个簇的切割位置,虚线下方的不同颜色对应最终簇。

tree = AgglomerativeClustering(
    n_clusters=None,
    distance_threshold=0,
    linkage="ward",
    compute_distances=True,
).fit(X_scaled)

n_samples = X_scaled.shape[0]
cluster_sizes = np.zeros(len(tree.children_), dtype=int)
for step, (left, right) in enumerate(tree.children_):
    left_size = 1 if left < n_samples else cluster_sizes[left - n_samples]
    right_size = 1 if right < n_samples else cluster_sizes[right - n_samples]
    cluster_sizes[step] = left_size + right_size

linkage_matrix = np.column_stack(
    [tree.children_, tree.distances_, cluster_sizes]
).astype(float)

lower_height = tree.distances_[-3]
upper_height = tree.distances_[-3 + 1]
cut_height = (lower_height + upper_height) / 2

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE)
dendrogram(
    linkage_matrix,
    color_threshold=cut_height,
    above_threshold_color="#6B7280",
    no_labels=True,
    ax=ax,
)
ax.axhline(cut_height, color="#E45756", linestyle="--", linewidth=2, label="cut for K = 3")
ax.set(title="Ward agglomerative hierarchy", xlabel="Individual samples", ylabel="Merge level")
ax.legend()
plt.show()

实验03

DBSCAN

Python · Jupyter

DBSCAN:非凸簇识别、参数选择与噪声诊断

本实验用带噪声的双弯月数据展示完整的 DBSCAN 分析流程:

  1. 检查数据并进行尺度标准化;
  2. 选择 εMinPts
  3. 区分核心点、边界点和噪声点,并汇总最终簇;
  4. 用内部指标、外部指标和噪声识别指标评价结果;

最后将结果与 K-means 对照,说明密度聚类对非凸结构的优势。

import matplotlib.pyplot as plt
from matplotlib_inline.backend_inline import InlineBackend
from matplotlib.lines import Line2D
from matplotlib.patches import Circle
import numpy as np
import pandas as pd
from sklearn.cluster import DBSCAN, KMeans
from sklearn.datasets import make_moons
from sklearn.metrics import adjusted_rand_score, silhouette_score
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

plt.style.use("seaborn-v0_8-whitegrid")
InlineBackend.instance().print_figure_kwargs = {"bbox_inches": None}
SINGLE_FIGSIZE = (8, 5.5)
COLORS = ["#4C78A8", "#F28E2B", "#59A14F", "#B279A2"]
RANDOM_STATE = 42

1. 构造含离群点的非凸数据

主体样本由两个相互嵌套的弯月形簇组成,再加入均匀分布的人工噪声。这样的数据不满足近似球形簇假设,适合检验 DBSCAN 的密度连通能力。

X_signal, y_signal = make_moons(
    n_samples=520, noise=0.075, random_state=RANDOM_STATE
)
rng = np.random.default_rng(RANDOM_STATE)
X_noise = rng.uniform(low=[-1.7, -1.2], high=[2.7, 1.7], size=(45, 2))
X = np.vstack([X_signal, X_noise])
y_true = np.concatenate([y_signal, np.full(len(X_noise), -1)])

data_summary = pd.DataFrame(
    {
        "quantity": [len(X), len(X_signal), len(X_noise), X.shape[1]],
        "value": [len(X), len(X_signal), len(X_noise), X.shape[1]],
    },
    index=["total samples", "signal samples", "injected noise", "features"],
)[["value"]]
display(data_summary)

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE)
ax.scatter(X_signal[:, 0], X_signal[:, 1], s=22, alpha=0.72, color="#4C78A8", label="signal")
ax.scatter(X_noise[:, 0], X_noise[:, 1], s=34, marker="x", linewidth=1.4, color="#6B7280", label="injected noise")
ax.set(title="Raw non-convex data with injected noise", xlabel="Feature 1", ylabel="Feature 2")
ax.legend()
plt.show()
value
total samples 565
signal samples 520
injected noise 45
features 2

2. 标准化与 k-distance 诊断

先将每个特征标准化。取 MinPts = 4,再计算每个样本到第 4 个近邻的距离。绘制 k-distance 曲线来选择 ε

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
min_samples = 4
neighbors = NearestNeighbors(n_neighbors=min_samples).fit(X_scaled)
distances, _ = neighbors.kneighbors(X_scaled)
k_distances = np.sort(distances[:, -1])
chosen_eps = 0.20

fig, axes = plt.subplots(1, 2, figsize=(13, 4.8), constrained_layout=True)
axes[0].scatter(X_scaled[:, 0], X_scaled[:, 1], s=20, alpha=0.7, color="#4C78A8")
axes[0].set(title="Standardized samples", xlabel="Standardized feature 1", ylabel="Standardized feature 2")
axes[1].plot(np.arange(1, len(k_distances) + 1), k_distances, color="#4C78A8", linewidth=2)
axes[1].axhline(chosen_eps, color="#E45756", linestyle="--", linewidth=2, label=f"candidate eps = {chosen_eps:.2f}")
axes[1].set(title=f"Sorted {min_samples}-distance curve", xlabel="Samples sorted by distance", ylabel=f"Distance to neighbor {min_samples}")
axes[1].legend()
plt.show()

3. 拟合最终模型并区分点类型

core_sample_indices_ 给出核心点。获得簇标签但不在该集合中的样本是边界点;标签为 −1 的样本是噪声点。下图同时呈现最终簇、三类点以及一个核心点的 ε-邻域。

dbscan = DBSCAN(eps=chosen_eps, min_samples=min_samples)
labels = dbscan.fit_predict(X_scaled)
core_mask = np.zeros(len(X_scaled), dtype=bool)
core_mask[dbscan.core_sample_indices_] = True
noise_mask = labels == -1
border_mask = (~core_mask) & (~noise_mask)
cluster_ids = sorted(set(labels) - {-1})

type_summary = pd.Series(
    np.select(
        [core_mask, border_mask, noise_mask],
        ["core", "border", "noise"],
        default="unknown",
    ),
    name="point_type",
).value_counts().rename_axis("point type").to_frame("count")
cluster_summary = pd.Series(labels[~noise_mask]).value_counts().sort_index().rename_axis("cluster").to_frame("samples")
display(type_summary)
display(cluster_summary)

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE, constrained_layout=True)
for cluster_id in cluster_ids:
    cluster_color = COLORS[cluster_id % len(COLORS)]
    cluster_core = (labels == cluster_id) & core_mask
    cluster_border = (labels == cluster_id) & border_mask
    ax.scatter(X_scaled[cluster_core, 0], X_scaled[cluster_core, 1], s=30, color=cluster_color, alpha=0.82)
    ax.scatter(X_scaled[cluster_border, 0], X_scaled[cluster_border, 1], s=48, facecolors="none", edgecolors=cluster_color, linewidth=1.5)
ax.scatter(X_scaled[noise_mask, 0], X_scaled[noise_mask, 1], s=42, marker="x", color="#4B5563", linewidth=1.4)
reference_index = dbscan.core_sample_indices_[len(dbscan.core_sample_indices_) // 3]
reference_point = X_scaled[reference_index]
ax.add_patch(Circle(reference_point, chosen_eps, fill=False, linestyle="--", linewidth=2, edgecolor="#ed3a3a"))
ax.annotate("one eps-neighborhood", reference_point, xytext=(18, 22), textcoords="offset points", color="#ed3a3a", arrowprops={"arrowstyle": "->", "color": "#ed3a3a"})
legend_items = [
    Line2D([0], [0], marker="o", color="none", markerfacecolor="#4C78A8", markeredgecolor="#4C78A8", label="core point"),
    Line2D([0], [0], marker="o", color="none", markerfacecolor="none", markeredgecolor="#4C78A8", label="border point"),
    Line2D([0], [0], marker="x", color="#4B5563", linestyle="none", label="noise point"),
]
ax.legend(handles=legend_items, loc="upper right")
ax.set(title="DBSCAN result: clusters and point types", xlabel="Standardized feature 1", ylabel="Standardized feature 2")
plt.show()
count
point type
core 526
noise 34
border 5
samples
cluster
0 264
1 267

4. 评价聚类与噪声识别

使用 Silhouette 和 ARI 进行模型评价。

true_noise = y_true == -1
true_positive_noise = np.sum(noise_mask & true_noise)
noise_precision = true_positive_noise / max(noise_mask.sum(), 1)
noise_recall = true_positive_noise / true_noise.sum()
non_noise = ~noise_mask
evaluation = pd.Series(
    {
        "clusters": len(cluster_ids),
        "noise samples": int(noise_mask.sum()),
        "noise rate": noise_mask.mean(),
        "silhouette (non-noise)": silhouette_score(X_scaled[non_noise], labels[non_noise]),
        "ARI (all samples)": adjusted_rand_score(y_true, labels),
        "noise precision": noise_precision,
        "noise recall": noise_recall,
    },
    name="value",
).to_frame()
evaluation.round(3)
value
clusters 2.000
noise samples 34.000
noise rate 0.060
silhouette (non-noise) 0.376
ARI (all samples) 0.944
noise precision 0.941
noise recall 0.711

5. 与 K-means 对照

kmeans_labels = KMeans(n_clusters=2, n_init=20, random_state=RANDOM_STATE).fit_predict(X_scaled)
comparison = pd.DataFrame(
    {
        "DBSCAN": [adjusted_rand_score(y_true, labels), silhouette_score(X_scaled[non_noise], labels[non_noise]), int(noise_mask.sum())],
        "K-means": [adjusted_rand_score(y_true, kmeans_labels), silhouette_score(X_scaled, kmeans_labels), 0],
    },
    index=["ARI", "Silhouette on assigned samples", "noise samples"],
)
display(comparison.round(3))

fig, axes = plt.subplots(1, 2, figsize=(13, 4.8), sharex=True, sharey=True, constrained_layout=True)
for cluster_id in cluster_ids:
    mask = labels == cluster_id
    axes[0].scatter(X_scaled[mask, 0], X_scaled[mask, 1], s=22, alpha=0.78, color=COLORS[cluster_id])
axes[0].scatter(X_scaled[noise_mask, 0], X_scaled[noise_mask, 1], s=36, marker="x", color="#4B5563")
axes[0].set_title("DBSCAN")
for cluster_id in np.unique(kmeans_labels):
    mask = kmeans_labels == cluster_id
    axes[1].scatter(X_scaled[mask, 0], X_scaled[mask, 1], s=22, alpha=0.78, color=COLORS[cluster_id])
axes[1].set_title("K-means")
for ax in axes:
    ax.set(xlabel="Standardized feature 1", ylabel="Standardized feature 2")
plt.show()
DBSCAN K-means
ARI 0.944 0.400
Silhouette on assigned samples 0.376 0.472
noise samples 34.000 0.000

观察

DBSCAN 在这个问题下能更好的恢复类别。

注意 K-menas 的 Silhouette 值比 DBSCAN 高,这提示我们不止得看聚类指标的具体值,分析时也需要结合具体的聚类图形。

实验04

OPTICS

Python · Jupyter

OPTICS:多密度结构、可达距离图与多尺度簇提取

本实验用三个密度水平明显不同的二维簇和人工噪声,展示一套完整的 OPTICS 分析流程:

  1. 标准化数据并诊断局部密度差异;
  2. 拟合 OPTICS;
  3. 用 reachability plot 识别谷地,并以 ξ 方法提取簇;
  4. 检查 MinPtsξ 和最小簇规模的敏感性;
  5. 汇总簇规模、噪声比例、内部指标和外部验证指标。
import matplotlib.pyplot as plt
from matplotlib_inline.backend_inline import InlineBackend
import numpy as np
import pandas as pd
from sklearn.cluster import OPTICS
from sklearn.datasets import make_blobs
from sklearn.metrics import adjusted_rand_score, silhouette_score
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

plt.style.use("seaborn-v0_8-whitegrid")
InlineBackend.instance().print_figure_kwargs = {"bbox_inches": None}
SINGLE_FIGSIZE = (8, 5.5)
COLORS = ["#4C78A8", "#F28E2B", "#59A14F", "#B279A2", "#76B7B2"]
RANDOM_STATE = 42

1. 构造不同密度的簇

三个簇的样本量和标准差分别不同。最左侧簇最紧密,中间簇密度居中,右侧簇最稀疏;此外加入均匀噪声。

X_signal, y_signal = make_blobs(
    n_samples=[160, 220, 280],
    centers=[(-6, -1), (0, 0), (6, 2)],
    cluster_std=[0.25, 0.60, 1.10],
    random_state=RANDOM_STATE,
)
rng = np.random.default_rng(RANDOM_STATE)
X_noise = rng.uniform(low=[-9, -5], high=[9, 5], size=(45, 2))
X = np.vstack([X_signal, X_noise])
y_true = np.concatenate([y_signal, np.full(len(X_noise), -1)])
X_scaled = StandardScaler().fit_transform(X)

data_summary = pd.DataFrame(
    {
        "samples": [160, 220, 280, 45],
        "generating std": [0.25, 0.60, 1.10, np.nan],
    },
    index=["dense cluster", "medium cluster", "sparse cluster", "injected noise"],
)
display(data_summary)

fig, axes = plt.subplots(1, 2, figsize=(13, 4.9), constrained_layout=True)
for cluster_id in range(3):
    mask = y_signal == cluster_id
    axes[0].scatter(X_signal[mask, 0], X_signal[mask, 1], s=22, alpha=0.75, color=COLORS[cluster_id], label=f"signal group {cluster_id + 1}")
axes[0].scatter(X_noise[:, 0], X_noise[:, 1], s=34, marker="x", color="#6B7280", linewidth=1.3, label="injected noise")
axes[0].set(title="Raw variable-density data", xlabel="Feature 1", ylabel="Feature 2")
axes[0].legend(fontsize=8)
axes[1].scatter(X_scaled[:, 0], X_scaled[:, 1], s=22, alpha=0.72, color="#4C78A8")
axes[1].set(title="Standardized samples used by OPTICS", xlabel="Standardized feature 1", ylabel="Standardized feature 2")
plt.show()
samples generating std
dense cluster 160 0.25
medium cluster 220 0.60
sparse cluster 280 1.10
injected noise 45 NaN

2. 诊断局部密度差异

MinPts = 10,计算每个样本到第 10 个近邻的距离。距离越小表示达到相同邻居数量所需的半径越小,即局部密度越高。

min_samples = 10
neighbor_model = NearestNeighbors(n_neighbors=min_samples).fit(X_scaled)
neighbor_distances, _ = neighbor_model.kneighbors(X_scaled)
k_distance = neighbor_distances[:, -1]
density_diagnostic = pd.DataFrame(
    {
        "median 10-distance": [np.median(k_distance[y_true == label]) for label in [0, 1, 2, -1]],
        "90% 10-distance": [np.quantile(k_distance[y_true == label], 0.90) for label in [0, 1, 2, -1]],
    },
    index=["dense cluster", "medium cluster", "sparse cluster", "injected noise"],
)
display(density_diagnostic.round(3))

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE)
distance_groups = [k_distance[y_true == label] for label in [0, 1, 2, -1]]
boxes = ax.boxplot(distance_groups, patch_artist=True, showfliers=False, medianprops={"color": "#111827", "linewidth": 1.5})
for patch, color in zip(boxes["boxes"], COLORS[:3] + ["#9CA3AF"]):
    patch.set_facecolor(color)
    patch.set_alpha(0.65)
ax.set_xticklabels(["dense", "medium", "sparse", "noise"])
ax.set(title="Local-density contrast via 10-distance", xlabel="Generating group (diagnostic only)", ylabel="Distance to neighbor 10")
plt.show()
median 10-distance 90% 10-distance
dense cluster 0.040 0.078
medium cluster 0.083 0.176
sparse cluster 0.144 0.266
injected noise 0.624 1.484

3. 拟合 OPTICS 并读取可达距离图

采用 MinPts = 10ξ = 0.07 和最小簇规模 5%max_eps = np.inf 表示不预先截断邻域尺度。OPTICS 先产生样本排序,再用 ξ 方法识别 reachability plot 中相对陡峭的下降与上升边界。

chosen_xi = 0.07
chosen_min_cluster_size = 0.05
optics = OPTICS(
    min_samples=min_samples,
    max_eps=np.inf,
    xi=chosen_xi,
    min_cluster_size=chosen_min_cluster_size,
    cluster_method="xi",
).fit(X_scaled)
labels = optics.labels_
ordering = optics.ordering_
ordered_reachability = optics.reachability_[ordering]
ordered_labels = labels[ordering]
finite_reachability = ordered_reachability[np.isfinite(ordered_reachability)]
reachability_cap = np.quantile(finite_reachability, 0.99)
plot_reachability = np.minimum(ordered_reachability, reachability_cap)
cluster_ids = sorted(set(labels) - {-1})

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE)
positions = np.arange(len(X_scaled))
for cluster_id in cluster_ids:
    mask = ordered_labels == cluster_id
    ax.bar(positions[mask], plot_reachability[mask], width=1.0, color=COLORS[cluster_id % len(COLORS)], label=f"cluster {cluster_id + 1}")
noise_ordered = ordered_labels == -1
ax.bar(positions[noise_ordered], plot_reachability[noise_ordered], width=1.0, color="#9CA3AF", label="noise")
ax.set(title="OPTICS reachability plot with xi extraction", xlabel="OPTICS ordering", ylabel="Reachability distance (99% capped)")
ax.legend(ncol=4, fontsize=8)
plt.show()

4. 检查参数敏感性

下面联合改变 MinPtsξ,固定最小簇规模为 5%。调参时主要查看簇数、噪声比例和非噪声样本的 Silhouette;ARI 依赖真实标签,只作为模拟实验的事后验证。ξ 越小,算法越容易把较小的局部下降识别成独立簇,也更容易产生碎片化。

min_samples_values = [8, 10, 15, 20]
xi_values = [0.03, 0.05, 0.07, 0.09]
rows = []
for current_min_samples in min_samples_values:
    for current_xi in xi_values:
        current_labels = OPTICS(
            min_samples=current_min_samples,
            max_eps=np.inf,
            xi=current_xi,
            min_cluster_size=chosen_min_cluster_size,
            cluster_method="xi",
        ).fit_predict(X_scaled)
        current_non_noise = current_labels != -1
        current_clusters = len(set(current_labels) - {-1})
        current_silhouette = np.nan
        if current_clusters >= 2 and current_non_noise.sum() > current_clusters:
            current_silhouette = silhouette_score(X_scaled[current_non_noise], current_labels[current_non_noise])
        rows.append(
            {
                "MinPts": current_min_samples,
                "xi": current_xi,
                "clusters": current_clusters,
                "noise_rate": (~current_non_noise).mean(),
                "silhouette_non_noise": current_silhouette,
                "ARI_all": adjusted_rand_score(y_true, current_labels),
            }
        )
sensitivity = pd.DataFrame(rows)
display(sensitivity.query("MinPts == 10").set_index("xi").round(3))

fig, axes = plt.subplots(1, 3, figsize=(15, 4.5), constrained_layout=True)
for current_min_samples in min_samples_values:
    part = sensitivity[sensitivity["MinPts"] == current_min_samples]
    axes[0].plot(part["xi"], part["clusters"], marker="o", label=f"MinPts={current_min_samples}")
    axes[1].plot(part["xi"], part["noise_rate"], marker="o")
    axes[2].plot(part["xi"], part["silhouette_non_noise"], marker="o")
axes[0].legend(fontsize=8)
for ax, title, ylabel in zip(axes, ["Extracted clusters", "Noise rate", "Silhouette on assigned samples"], ["Clusters", "Noise fraction", "Silhouette"]):
    ax.axvline(chosen_xi, color="#111827", linestyle="--", linewidth=1.2)
    ax.set(title=title, xlabel="xi", ylabel=ylabel, xticks=xi_values)
plt.show()
MinPts clusters noise_rate silhouette_non_noise ARI_all
xi
0.03 10 4 0.658 0.734 0.132
0.05 10 3 0.340 0.677 0.603
0.07 10 3 0.035 0.640 0.945
0.09 10 3 0.037 0.641 0.947

5. 最终聚类结果与评价

最终图同时给出 ξ 提取的簇和噪声点。Silhouette 只在已分配样本上计算;整体 ARI 将真实噪声和预测噪声都视为标签的一部分;signal-only ARI 只在真实非噪声样本上计算,并仍会惩罚被错误标为噪声的主体样本。噪声 precision 与 recall 则单独评价异常点识别。

noise_mask = labels == -1
non_noise = ~noise_mask
true_noise = y_true == -1
signal_mask = ~true_noise
true_positive_noise = np.sum(noise_mask & true_noise)
cluster_summary = pd.Series(labels[non_noise]).value_counts().sort_index().rename_axis("cluster").to_frame("samples")
cluster_summary.index = [f"cluster {index + 1}" for index in cluster_summary.index]
display(cluster_summary)
evaluation = pd.Series(
    {
        "clusters": len(cluster_ids),
        "noise samples": int(noise_mask.sum()),
        "noise rate": noise_mask.mean(),
        "silhouette (non-noise)": silhouette_score(X_scaled[non_noise], labels[non_noise]),
        "ARI (all samples)": adjusted_rand_score(y_true, labels),
        "ARI (true signal only)": adjusted_rand_score(y_true[signal_mask], labels[signal_mask]),
        "noise precision": true_positive_noise / max(noise_mask.sum(), 1),
        "noise recall": true_positive_noise / true_noise.sum(),
    },
    name="value",
).to_frame()
display(evaluation.round(3))

fig, ax = plt.subplots(figsize=SINGLE_FIGSIZE)
for cluster_id in cluster_ids:
    mask = labels == cluster_id
    ax.scatter(X_scaled[mask, 0], X_scaled[mask, 1], s=25, alpha=0.78, color=COLORS[cluster_id % len(COLORS)], label=f"cluster {cluster_id + 1}")
ax.scatter(X_scaled[noise_mask, 0], X_scaled[noise_mask, 1], s=40, marker="x", color="#4B5563", linewidth=1.3, label="noise")
ax.set(title="OPTICS xi extraction on variable-density data", xlabel="Standardized feature 1", ylabel="Standardized feature 2")
ax.legend(fontsize=8)
plt.show()
samples
cluster 1 166
cluster 2 223
cluster 3 291
value
clusters 3.000
noise samples 25.000
noise rate 0.035
silhouette (non-noise) 0.640
ARI (all samples) 0.945
ARI (true signal only) 0.997
noise precision 0.960
noise recall 0.533