LDA 协方差矩阵(MATLAB fitcdiscr)
Mdl.Sigma与Mdl.BetweenSigma返回的都是协方差矩阵(已归一化),不是教材里的"散度矩阵(scatter matrix)"。二者只差一个常数缩放。
符号约定
| 符号 | 含义 |
|---|---|
| KKK | 类别数 |
| nkn_knk | 第 kkk 类样本数 |
| NNN | 总样本数,N=∑k=1KnkN=\sum_{k=1}^{K} n_kN=∑k=1Knk |
| pkp_kpk | 经验类先验,pk=nk/Np_k = n_k / Npk=nk/N |
| μk\boldsymbol{\mu}_kμk | 第 kkk 类均值 |
| μ{\boldsymbol{\mu}}μ | 全局均值,μ=∑k=1Kpkμk{\boldsymbol{\mu}} = \sum_{k=1}^{K} p_k \boldsymbol{\mu}_kμ=∑k=1Kpkμk |
1. 类内协方差 Mdl.Sigma(pooled within-class)
无偏的合并类内协方差:
Σw=1N−K∑k=1K∑i∈Ck(xi−μk)(xi−μk)⊤=∑k=1Knk−1N−K Sk \boldsymbol{\varSigma}\mathrm {w} = \frac{1}{N-K}\sum{k=1}^{K}\sum_{i\in C_k} (\boldsymbol{x}_i-\boldsymbol{\mu}_k)(\boldsymbol{x}_i-\boldsymbol{\mu}k)^{\top} = \sum{k=1}^{K}\frac{n_k-1}{N-K}\,\boldsymbol{S}_k Σw=N−K1k=1∑Ki∈Ck∑(xi−μk)(xi−μk)⊤=k=1∑KN−Knk−1Sk
其中第 kkk 类无偏样本协方差为:
Sk=1nk−1∑i∈Ck(xi−μk)(xi−μk)⊤ \boldsymbol{S}k = \frac{1}{n_k-1}\sum{i\in C_k} (\boldsymbol{x}_i-\boldsymbol{\mu}_k)(\boldsymbol{x}_i-\boldsymbol{\mu}_k)^{\top} Sk=nk−11i∈Ck∑(xi−μk)(xi−μk)⊤
权重之和满足 ∑k=1Knk−1N−K=1\sum_{k=1}^{K}\dfrac{n_k-1}{N-K}=1∑k=1KN−Knk−1=1。
2. 类间协方差 Mdl.BetweenSigma
按各类样本量加权的类均值协方差,归一化分母取"无偏"形式:
Σb=∑k=1Knk (μk−μ)(μk−μ)⊤N(1−∑k=1Kpk2) \boldsymbol{\varSigma}\mathrm {b} = \frac{\displaystyle\sum{k=1}^{K} n_k\, (\boldsymbol{\mu}_k-{\boldsymbol{\mu}}) (\boldsymbol{\mu}k-{\boldsymbol{\mu}})^{\top}} {\displaystyle N\Bigl(1-\sum{k=1}^{K}p_k^{2}\Bigr)} Σb=N(1−k=1∑Kpk2)k=1∑Knk(μk−μ)(μk−μ)⊤
类别均衡时(nk=N/Kn_k = N/Knk=N/K,即 pk=1/Kp_k = 1/Kpk=1/K)化简为:
Σb=1K−1∑k=1K(μk−μ)(μk−μ)⊤ \boldsymbol{\varSigma}\mathrm {b} = \frac{1}{K-1}\sum{k=1}^{K} (\boldsymbol{\mu}_k-{\boldsymbol{\mu}}) (\boldsymbol{\mu}_k-{\boldsymbol{\mu}})^{\top} Σb=K−11k=1∑K(μk−μ)(μk−μ)⊤
它只取决于类样本量 ,与
Prior设置无关(改先验不会改变它),且对 linear / quadratic 都会计算。
3. 与经典散度矩阵的关系
Sw=∑k=1K∑i∈Ck(xi−μk)(xi−μk)⊤=(N−K) ΣwSb=∑k=1Knk (μk−μ)(μk−μ)⊤=N(1−∑k=1Kpk2)ΣbST=Sw+Sb \begin{aligned} \boldsymbol{S}{\mathrm w} &= \sum{k=1}^{K}\sum_{i\in C_k} (\boldsymbol{x}i-\boldsymbol{\mu}k)(\boldsymbol{x}i-\boldsymbol{\mu}k)^{\top} = (N-K)\,\boldsymbol{\varSigma}\mathrm {w} \\4pt \boldsymbol{S}{\mathrm b} &= \sum{k=1}^{K} n_k\, (\boldsymbol{\mu}k-{\boldsymbol{\mu}}) (\boldsymbol{\mu}k-{\boldsymbol{\mu}})^{\top} = N\Bigl(1-\sum{k=1}^{K}p_k^{2}\Bigr)\boldsymbol{\varSigma}\mathrm {b} \\4pt \boldsymbol{S}T &= \boldsymbol{S}{\mathrm w}+\boldsymbol{S}{\mathrm b} \end{aligned} SwSbST=k=1∑Ki∈Ck∑(xi−μk)(xi−μk)⊤=(N−K)Σw=k=1∑Knk(μk−μ)(μk−μ)⊤=N(1−k=1∑Kpk2)Σb=Sw+Sb
4. MATLAB 中还原"教科书散度矩阵"
matlab
K = numel(ldaModel.ClassNames);
N = size(data,1);
n_k = histcounts(y); % 各类样本数(或用 groupsummary / accumarray)
p_k = n_k(:) / N;
Sw_scatter = ldaModel.Sigma * (N - K);
Sb_scatter = ldaModel.BetweenSigma * (N * (1 - sum(p_k.^2)));
5. 两点提醒
- 求投影方向时 Σw−1Σbw=λw\boldsymbol{\varSigma}\mathrm {w}^{-1}\boldsymbol{\varSigma}\mathrm {b}\boldsymbol{w}=\lambda\boldsymbol{w}Σw−1Σbw=λw 的特征向量对Σw\boldsymbol{\varSigma}\mathrm {w}Σw、Σb\boldsymbol{\varSigma}\mathrm {b}Σb 的常数缩放不敏感(只有特征值变化),因此直接用
Mdl.Sigma、Mdl.BetweenSigma做特征分解与用散度矩阵Sw\boldsymbol{S}{\mathrm w}Sw、Sb\boldsymbol{S}{\mathrm b}Sb 得到的方向一致。 - 形状随
DiscrimType变化 :默认'linear'时Sigma为单个 p×pp\times pp×p 矩阵;'quadratic'时为 p×p×Kp\times p\times Kp×p×K(每类一个),而BetweenSigma恒为单个 p×pp\times pp×p。