数据分析与处理(二)线性判别分析(LDA)

it2022-05-05  111

线性判别分析

  之前分析了主成分分析,是一种线性的降维方法,今天再来分析一下线性判别分析。   PCA和LDA都是线性的降维方法,PCA是无监督的,它没有考虑样本数据的标签;LDA是有标签的,它考虑样本的标签,并致力于让样本数据可分性最大化。二者都用于数据降维,而且经常一起使用。

原理

  在做分类算法的时候,我们的准则是要让类间距离尽可能大,类内距离尽可能小。LDA用于分类问题,假设我们现在有一个分类问题,共有C个类,每个类有 N i N_i Ni个m维的样本,对于 ω i \omega_i ωi类而言,它的数据集定义如下: { x 1 , x 2 , . . . , x N i } \{x^1,x^2,...,x^{N_i}\} {x1,x2,...,xNi} 我们希望能够找到一种映射,将原始数据X映射到Y,Y位于一个C-1维的超平面上。 以两类问题为例, ω 1 : { x 1 , x 2 , . . . , x N 1 } \omega_1:\{x^1,x^2,...,x^{N_1}\} ω1:{x1,x2,...,xN1}, ω 2 : { x 1 , x 2 , . . . , x N 2 } \omega_2:\{x^1,x^2,...,x^{N_2}\} ω2:{x1,x2,...,xN2} 利用变换矩阵w,我们希望将x投影到一维坐标上,也就是一个数值,对此,我们有 y = w T x y=w^Tx y=wTx w是m*1的列向量,我们需要将y的可分性最大化。 对于x,我们有 μ i = 1 N i ∑ x ∈ ω i x \mu_i=\frac{1}{N_i}\sum_{x\in\omega_i}x μi=Ni1xωix 对于y,我们有 μ ~ = 1 N i ∑ y ∈ ω i y = 1 N i ∑ x ∈ ω i w T x = w T 1 N i ∑ x ∈ ω i x = w T μ i \tilde{\mu}=\frac{1}{N_i}\sum_{y\in\omega_i}y=\frac{1}{N_i}\sum_{x\in\omega_i}w^Tx=w^T\frac{1}{N_i}\sum_{x\in\omega_i}x=w^T\mu_i μ~=Ni1yωiy=Ni1xωiwTx=wTNi1xωix=wTμi 投影后的类间均值距离为 J ( w ) = ∣ μ 1 ~ − μ 2 ~ ∣ = ∣ w T μ 1 − w T μ 2 ∣ = ∣ w T ( μ 1 − μ 2 ) ∣ J(w)=|\tilde{\mu_1}-\tilde{\mu_2}|=|w^T\mu_1-w^T\mu_2|=|w^T(\mu_1-\mu_2)| J(w)=μ1~μ2~=wTμ1wTμ2=wT(μ1μ2) 这个距离存在一定的局限性,因为它没有考虑类内的方差,改进的办法是引入类内标方。 对于投影后的y,我们有 s i ~ 2 = ∑ y ∈ ω i ( y − μ i ~ ) 2 \tilde{s_i}^2=\sum_{y\in\omega_i}{(y-\tilde{\mu_i})}^2 si~2=yωi(yμi~)2 我们用 s 1 ~ 2 \tilde{s_1}^2 s1~2 s 2 ~ 2 \tilde{s_2}^2 s2~2来衡量投影后类间的方差。 修正后的类间距离为 J ( w ) = ∣ μ 1 ~ − μ 2 ~ ∣ 2 s 1 ~ 2 + s 2 ~ 2 J(w)=\frac{|\tilde{\mu_1}-\tilde{\mu_2}|^2}{\tilde{s_1}^2+\tilde{s_2}^2} J(w)=s1~2+s2~2μ1~μ2~2 这和我们的直觉是相符合的,我们需要让投影后的类间距离最大,而类内距离最小,这和上式的分子和分母是相对应的。 类内协方差矩阵如下: S i = ∑ x ∈ ω i ( x − μ i ) ( x − μ i ) T S_i=\sum_{x\in\omega_i}(x-\mu_i)(x-\mu_i)^T Si=xωi(xμi)(xμi)T 类内散布矩阵如下: S w = S 1 + S 2 S_w=S_1+S_2 Sw=S1+S2 基于此,有 s i ~ 2 = ∑ y ∈ ω i ( y − μ ~ ) 2 = ∑ x ∈ ω i ( w T x − w T μ i ) 2 = ∑ x ∈ ω i w T ( x − μ i ) ( x − μ i ) T w = w T ( ∑ x ∈ ω i ( x − μ i ) ( x − μ i ) T ) w = w T S i w \tilde{s_i}^2=\sum_{y\in\omega_i}(y-\tilde{\mu})^2\\=\sum_{x\in\omega_i}(w^Tx-w^T\mu_i)^2\\=\sum_{x\in\omega_i}w^T(x-\mu_i)(x-\mu_i)^Tw\\=w^T(\sum_{x\in\omega_i}(x-\mu_i)(x-\mu_i)^T)w\\=w^TS_iw si~2=yωi(yμ~)2=xωi(wTxwTμi)2=xωiwT(xμi)(xμi)Tw=wT(xωi(xμi)(xμi)T)w=wTSiw 然后, s 1 ~ 2 + s 2 ~ 2 = w T S 1 w + w T S 2 w = w T ( S 1 + S 2 ) w = w T S w w = S w ~ \tilde{s_1}^2+\tilde{s_2}^2=w^TS_1w+w^TS_2w\\=w^T(S_1+S_2)w\\=w^TS_ww\\=\tilde{S_w} s1~2+s2~2=wTS1w+wTS2w=wT(S1+S2)w=wTSww=Sw~

∣ μ 1 ~ − μ 2 ~ ∣ 2 = ( w T μ 1 − w T μ 2 ) 2 = w T ( μ 1 − μ 2 ) ( μ 1 − μ 2 ) T w = w T S B w = S B ~ |\tilde{\mu_1}-\tilde{\mu_2}|^2=(w^T\mu_1-w^T\mu_2)^2\\=w^T(\mu_1-\mu_2)(\mu_1-\mu_2)^Tw\\=w^TS_Bw\\=\tilde{S_B} μ1~μ2~2=(wTμ1wTμ2)2=wT(μ1μ2)(μ1μ2)Tw=wTSBw=SB~ S B S_B SB为类间散布矩阵。 J ( w ) = ∣ μ 1 ~ − μ 2 ~ ∣ 2 s 1 ~ 2 + s 2 ~ 2 = w T S B w w T S w w J(w)=\frac{|\tilde{\mu_1}-\tilde{\mu_2}|^2}{\tilde{s_1}^2+\tilde{s_2}^2}=\frac{w^TS_Bw}{w^TS_ww} J(w)=s1~2+s2~2μ1~μ2~2=wTSwwwTSBw 为了使J(w)最小,我们需要对其进行求导,我们要找到一个w,使得上式最大 d d x J ( w ) = d d w { w T S B w w T S w w } = 0 \frac{\mathrm{d}}{\mathrm{d}x}J(w)=\frac{\mathrm{d}}{\mathrm{d}w}\{\frac{w^TS_Bw}{w^TS_ww}\}=0 dxdJ(w)=dwd{wTSwwwTSBw}=0 即需要让求导后的分子为0, { w T S w w } d d w { w T S B w } − { w T S B w } d d w w T S w w = 0 \{w^TS_ww\}\frac{\mathrm{d}}{\mathrm{d}w}\{w^TS_Bw\}-\{w^TS_Bw\}\frac{\mathrm{d}}{\mathrm{d}w}{w^TS_ww}=0 {wTSww}dwd{wTSBw}{wTSBw}dwdwTSww=0 即, ( w T S w w ) 2 S B w − ( w T S B w ) 2 S w w = 0 (w^TS_ww)2S_Bw-(w^TS_Bw)2S_ww=0 (wTSww)2SBw(wTSBw)2Sww=0 两边同时除以 2 w T S w w 2w^TS_ww 2wTSww,得到 w T S w w w T S w w S B w − w T S B w w T S w w S w w = 0 \frac{w^TS_ww}{w^TS_ww}S_Bw-\frac{w^TS_Bw}{w^TS_ww}S_ww=0 wTSwwwTSwwSBwwTSwwwTSBwSww=0 → S B w − J ( w ) S w w = 0 \rightarrow S_Bw-J(w)S_ww=0 SBwJ(w)Sww=0 → S w − 1 S B w − J ( w ) w = 0 \rightarrow S_w^{-1}S_Bw-J(w)w=0 Sw1SBwJ(w)w=0 解上式得, S w − 1 S B w = λ w S_w^{-1}S_Bw=\lambda w Sw1SBw=λw 这就是我们熟悉的特征值了。 于是, w ∗ = arg ⁡ max ⁡ w J ( w ) = arg ⁡ max ⁡ w { w T S B w w T S w w } w^*= \arg \max _wJ(w)=\arg \max _w\{\frac{w^TS_Bw}{w^TS_ww}\} w=argwmaxJ(w)=argwmax{wTSwwwTSBw} w是 S w − 1 S B S_w^{-1}S_B Sw1SB的最大特征值对应的特征向量。

多类的情况

  之前我们讨论了两类时的情况,下面我们将扩展到多类时的情形,分析是类似的。   假定我们目前有C个类,我们需要C-1个向量,将原始数据映射到C-1维的超平面上。转换矩阵为 W = [ w 1 , w 2 , . . . , w C − 1 ] W=[w_1,w_2,...,w_{C-1}] W=[w1,w2,...,wC1], y i = w i T x y_i=w_i^Tx yi=wiTx,x是m1的向量,y是c1的向量,W是m*(C-1)的矩阵。 假设数据集大小为n,每组数据有m个特征,则上式可以表示如下: Y = W T X Y=W^TX Y=WTX X m ∗ n = [ x 1 1 x 1 2 ⋯ x 1 n ⋮ ⋮ ⋮ ⋮ x m 1 x m 2 ⋯ x m n ] X_{m*n}=\left[\begin{matrix} x_1^1 &x_1^2 &\cdots &x_1^n\\ \vdots &\vdots &\vdots &\vdots\\ x_m^1 &x_m^2 &\cdots &x_m^n \end{matrix} \right] Xmn=x11xm1x12xm2x1nxmn Y C − 1 ∗ n = [ y 1 1 y 1 2 ⋯ y 1 n ⋮ ⋮ ⋮ ⋮ y C − 1 1 y C − 1 2 ⋯ y C − 1 n ] Y_{C-1*n}=\left[\begin{matrix} y_1^1 &y_1^2 &\cdots &y_1^n\\ \vdots &\vdots &\vdots &\vdots\\ y_{C-1}^1 &y_{C-1}^2 &\cdots &y_{C-1}^n \end{matrix} \right] YC1n=y11yC11y12yC12y1nyC1n W m C − 1 = [ w 1 , w 2 , . . . , w C − 1 ] W_{m}^{C-1}=[w_1,w_2,...,w_{C-1}] WmC1=[w1,w2,...,wC1] 类内散布矩定义如下: S w = ∑ i = 1 C S i S_w=\sum_{i=1}^{C}S_i Sw=i=1CSi S i = ∑ x ∈ ω i ( x − μ i ) ( x − μ i ) T S_i=\sum_{x\in\omega_i}(x-\mu_i)(x-\mu_i)^T Si=xωi(xμi)(xμi)T μ i = 1 N i ∑ x ∈ ω i x \mu_i=\frac{1}{N_i}\sum_{x\in\omega_i}x μi=Ni1xωix 类间散布矩阵定义如下: S B = ∑ i = 1 C N i ( μ i − μ ) ( μ i − μ ) T S_B=\sum_{i=1}^{C}N_i(\mu_i-\mu)(\mu_i-\mu)^T SB=i=1CNi(μiμ)(μiμ)T μ = 1 N ∑ ∀ x x = 1 N ∑ i = 1 C N i μ i \mu=\frac{1}{N}\sum_{\forall x}x=\frac{1}{N}\sum_{i=1}^{C}N_i\mu_i μ=N1xx=N1i=1CNiμi μ i = 1 N i ∑ x ∈ ω i x \mu_i=\frac{1}{N_i}\sum_{x\in\omega_i}x μi=Ni1xωix 同样的,对于y,我们有 μ i ~ = 1 N i ∑ y ∈ ω i y \tilde{\mu_i}=\frac{1}{N_i}\sum_{y\in\omega_i}y μi~=Ni1yωiy μ ~ = 1 N ∑ ∀ y y \tilde{\mu}=\frac{1}{N}\sum_{\forall y}y μ~=N1yy S w ~ = ∑ i = 1 C S i ~ = ∑ i = 1 C ∑ y ∈ ω i ( y − μ i ~ ) ( y − μ i ~ ) T \tilde{S_w}=\sum_{i=1}^{C}\tilde{S_i}=\sum_{i=1}^{C}\sum_{y\in\omega_i}(y-\tilde{\mu_i})(y-\tilde{\mu_i})^T Sw~=i=1CSi~=i=1Cyωi(yμi~)(yμi~)T S B ~ = ∑ i = 1 C N i ( μ i ~ − μ ~ ) ( μ i ~ − μ ~ ) T \tilde{S_B}=\sum_{i=1}^{C}N_i(\tilde{\mu_i}-\tilde{\mu})(\tilde{\mu_i}-\tilde{\mu})^T SB~=i=1CNi(μi~μ~)(μi~μ~)T 再来计算J(w), S w ~ = W T S w W \tilde{S_w}=W^TS_wW Sw~=WTSwW S B ~ = W T S B W \tilde{S_B}=W^TS_BW SB~=WTSBW J ( w ) = ∣ S B ~ ∣ ∣ S w ~ ∣ = ∣ W T S B W ∣ ∣ W T S w W ∣ J(w)=\frac{|\tilde{S_B}|}{|\tilde{S_w}|}=\frac{|W^TS_BW|}{|W^TS_wW|} J(w)=Sw~SB~=WTSwWWTSBW 此时的类间散布矩阵已经不是数值了,所以我们取了它的行列式的值。 依然用求导的方法,我们可以得到, S w − 1 S B w i = λ i w i S_w^{-1}S_Bw_i=\lambda_iw_i Sw1SBwi=λiwi λ i = J ( w i ) \lambda_i=J(w_i) λi=J(wi) 于是,转换矩阵W是由 S w − 1 S B S_w^{-1}S_B Sw1SB的前C-1大的特征值对应的特征向量组成的。

局限性

LDA也有它自身的局限性,它最多只能提供C-1维的特征映射,如果需要更多的特征就不能采用LDA了。LDA假定样本数据服从的是高斯分布,如果样本服从的不是高斯分布,则LDA不再成立。当样本的判别信息不是均值而是方差的时候,LDA会失效。举个极端的例子就是当不同类别的样本数据的均值相同的时候,这是它们的类间距离都为0,经过线性映射后的Y的类间距离也为0,J(w)就没有意义了。

实验效果

python sklearn中有LDA的模块,可以直接利用它来进行线性判别分析,我们采用鸢尾花数据进行测试。 代码如下:

from sklearn.datasets import load_iris from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import train_test_split import numpy as np iris_data=load_iris() X=iris_data['data'] y=iris_data['target'] #print(X.shape) # (150,4) #print(y.shape) #(150,) # print(y) lda=LinearDiscriminantAnalysis() X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0,stratify=y) # print(X_train.shape) # print(X_test.shape) lda.fit(X_train,y_train) print(lda.coef_) print(lda.intercept_) print(lda.score(X_test,y_test)) X_transformed=np.dot(X_train,lda.coef_.transpose(1,0)) # print(X_transformed.shape) #(150,3) fig=plt.figure() ax=Axes3D(fig,rect=[0,0,1,1],elev=30,azim=20) colors=['r','g','b','yellow'] for i in range(X_transformed.shape[0]): ax.scatter(X_transformed[i][0],X_transformed[i][1],X_transformed[i],color=colors[y_train[i]],marker='*') plt.show()

采用的是jupyter notebook,降维后的样本分布如下:

参考资料

pdf文件

最新回复(0)