LDA中的三个散度矩阵

转载出处:https://blog.youkuaiyun.com/Oxalis_Triangularis/article/details/47420521


LDA中的三个散度矩阵

在学习LDA(Linear Discriminate Analysis)的时候接触到了散度矩阵的概念,并且很多文章提到到混合散度矩阵等于类间散度矩阵与类内散度矩阵之和。我自己证明了一下。

总体散度矩阵(total scatter matrix) 
 

St=i=1Cj=1nip(i,j)(xijμ)(xijμ)TSt=∑i=1C∑j=1nip(i,j)(xji−μ)(xji−μ)T

其中xijxji表示第ii类的第jj个样本,p(i,j)p(i,j)表示xijxji出现的概率,μμ为总体均值,CC为类数,nini为第ii类的样本数。

类内散度矩阵(within-class scatter matrix) 

Sw=i=1Cp(i)SiSw=∑i=1Cp(i)Si

其中Si=Ci=1p(i)(μiμ)(μiμ)TSi=∑i=1Cp(i)(μi−μ)(μi−μ)T,表示第ii类的类间散度矩阵,p(i)p(i)为第ii类出现的概率,并且p(i)p(j|i)=p(i,j)p(i)p(j|i)=p(i,j).

类间散度矩阵(between-class scatter matrix) 

Sb=i=1Cp(i)(μiμ)(μiμ)TSb=∑i=1Cp(i)(μi−μ)(μi−μ)T

其中μiμi是第ii类的均值。我们可以对StSt作分解,

St=i=1Cj=1nip(i,j)(xijμi+μiμ)(xijμi+μiμ)T=i=1Cj=1nip(i,j)(xijμi)(xijμi)T+i=1Cj=1nip(i,j)(μiμ)(μiμ)T+i=1Cj=1nip(i,j)(xijμi)(μiμ)T+i=1Cj=1nip(i,j)(μiμ)(xijμi)TSt=∑i=1C∑j=1nip(i,j)(xji−μi+μi−μ)(xji−μi+μi−μ)T=∑i=1C∑j=1nip(i,j)(xji−μi)(xji−μi)T+∑i=1C∑j=1nip(i,j)(μi−μ)(μi−μ)T+∑i=1C∑j=1nip(i,j)(xji−μi)(μi−μ)T+∑i=1C∑j=1nip(i,j)(μi−μ)(xji−μi)T

将上式中的四部分分别记为A,B,C,DA,B,C,D, 那么 

ABCD=i=1Cp(i)j=1nip(j|i)(xijμi)(xijμi)T=i=1Cp(i)Si=Sw=i=1Cp(i)(μiμ)(μiμ)Tj=1nip(j|i)=i=1Cp(i)(μiμ)(μiμ)T=Sb=i=1Cp(i)(j=1nip(j|i)(xijμi))(μiμ)=i=1Cp(i)(j=1nip(j|i)xijμi)(μiμ)=0=0A=∑i=1Cp(i)∑j=1nip(j|i)(xji−μi)(xji−μi)T=∑i=1Cp(i)Si=SwB=∑i=1Cp(i)(μi−μ)(μi−μ)T∑j=1nip(j|i)=∑i=1Cp(i)(μi−μ)(μi−μ)T=SbC=∑i=1Cp(i)(∑j=1nip(j|i)(xji−μi))(μi−μ)=∑i=1Cp(i)(∑j=1nip(j|i)xji−μi)(μi−μ)=0同理D=0

所以St=Sb+Sb
<think>好的,我现在要解决用户关于sklearn中LinearDiscriminantAnalysis(LDA)的总度矩阵度矩阵度矩阵的关系的问题。首先,我需要回忆一下LDA的基本原理和相关矩阵的定义。 用户提到的三个矩阵:总度矩阵(St)、度矩阵(Sw)和度矩阵(Sb)。根据之前的引用资料,比如引用[2]和[3],知道在LDA中,Sw表示别内的差异,Sb表示的差异,而总度矩阵应该是两者的总和。具体来说,St = Sw + Sb。这一点可能在很多模式识别的教材中都有提到,比如在费舍尔线性判别分析中,总方差分解为内和部分。 接下来,我需要确认sklearn中的LinearDiscriminantAnalysis是否遵循这一关系。查阅sklearn的官方文档,LDA部分的说明指出,它通过最大化度与度的比率来进行降维。数学上,这通常表示为Sb和Sw的比值,而总度矩阵St确实是两者的和。不过,有时候不同的文献可能会有不同的定义,比如是否考虑样本数的影响,比如St是否是协方差矩阵乘以(n-1)或者其他系数。 另外,用户提供的引用中提到,布矩阵(度矩阵)乘以1/(n-1)就是协方差矩阵,所以需要注意sklearn在计算这些矩阵时是否做了归一化处理。例如,Sw在计算时是否除以样本数或者n-1,这可能会影响矩阵的具体数值,但不会改变它们的关系St = Sw + Sb。 还需要考虑sklearn的具体实现。查看源代码可能会发现,LinearDiscriminantAnalysis的度矩阵是通过对各的协方差矩阵进行加权平均得到的,而度矩阵则是通过计算各均值与总体均值的差异来构造的。总度矩阵则是全体样本的协方差矩阵乘以(n-1),即布矩阵的形式。 此时需要验证这三个矩阵的关系是否成立。例如,假设总度矩阵St是全体样本的布矩阵,Sw是各布矩阵之和,Sb是布矩阵,那么理论上St = Sw + Sb。如果sklearn的实现中严格遵循这一公式,那么用户的答案就是肯定的,并且需要解释每个矩阵的计算方式以及它们如何相加。 可能遇到的问题包括:不同的资料对度矩阵的定义是否一致,比如有的地方可能用样本均值而非总体均值,或者是否考虑别的权重。例如,Sw的计算是否使用每个别的样本数作为权重,而Sb是否也是基于样本数加权的均值与总体均值的差异。在sklearn的实现中,这些细节需要明确。 例如,Sw的计算公式可能是对每个别的协方差矩阵乘以(该样本数-1),然后求和。而Sb则是每个别的均值与总体均值的差的外积,乘以该别的样本数,再求和。这样,总度矩阵St(全体样本的布矩阵)等于Sw加上Sb。这需要数学上的验证。 另外,总度矩阵St也可以直接由样本数据计算,即中心化后的数据的转置乘以中心化后的数据,而Sw和Sb如上述方式计算,它们的和应等于St。用户可能希望得到这样的确认,以及sklearn中这三个矩阵是否满足这种关系。 总结来说,回答需要明确三点:定义、数学关系、sklearn中的实现是否符合这一关系。同时,引用提供的资料,如引用[2]和[3]中的内和度矩阵的定义,以及它们与总度的关系,来支持回答的准确性。</think>在sklearn的LinearDiscriminantAnalysis(LDA)中,总度矩阵$S_t$、度矩阵$S_W$和度矩阵$S_B$满足以下关系: $$ S_t = S_W + S_B $$ ### 具体定义 1. **总度矩阵$S_t$** 表示全体样本的布程度,计算公式为: $$S_t = \sum_{i=1}^{n} (x_i - \mu)(x_i - \mu)^T$$ 其中$\mu$是全体样本的均值向量,$n$是样本总数[^1]。 2. **度矩阵$S_W$** 反映各内部数据的分程度,是各协方差矩阵的加权和: $$S_W = \sum_{c=1}^{C} \sum_{x \in c} (x - \mu_c)(x - \mu_c)^T$$ 其中$\mu_c$是第$c$的均值向量,$C$是别数[^2]。 3. **度矩阵$S_B$** 反映不同别之的差异,计算公式为: $$S_B = \sum_{c=1}^{C} n_c (\mu_c - \mu)(\mu_c - \mu)^T$$ 其中$n_c$是第$c$的样本数[^3]。 ### 数学关系验证 - **总度分解**:$S_t$可分解为度$S_W$和度$S_B$的叠加。这一关系在LDA中至关重要,因为优化目标是通过最大化差异与内差异的比值(即$S_B/S_W$)来实现分。 ### sklearn中的实现 在sklearn的`LinearDiscriminantAnalysis`中: - $S_W$通过`covariance_`属性提供(需加权求和各协方差矩阵)。 - $S_B$未直接暴露,但可通过均值和样本数手动计算。 - $S_t$未显式定义,但可通过$S_t = S_W + S_B$接验证。 ### 示例代码 ```python from sklearn.discriminant_analysis import LinearDiscriminantAnalysis import numpy as np # 假设X是样本数据,y是别标签 lda = LinearDiscriminantAnalysis() lda.fit(X, y) # 手动计算S_W和S_B n_samples = X.shape[0] overall_mean = np.mean(X, axis=0) S_W = np.zeros((X.shape[1], X.shape[1])) S_B = np.zeros_like(S_W) for c in np.unique(y): X_c = X[y == c] n_c = X_c.shape[0] mean_c = np.mean(X_c, axis=0) # 度 S_W += (n_c - 1) * np.cov(X_c, rowvar=False) # 度 diff = (mean_c - overall_mean).reshape(-1, 1) S_B += n_c * diff @ diff.T # 验证S_t = S_W + S_B S_t = (n_samples - 1) * np.cov(X, rowvar=False) np.allclose(S_t, S_W + S_B) # 应返回True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值