我是靠谱客的博主 整齐钢铁侠,最近开发中收集的这篇文章主要介绍数据分析与处理(二)线性判别分析(LDA)线性判别分析多类的情况局限性实验效果,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线性判别分析

  之前分析了主成分分析,是一种线性的降维方法,今天再来分析一下线性判别分析。
  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_{xinomega_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_{yinomega_i}y=frac{1}{N_i}sum_{xinomega_i}w^Tx=w^Tfrac{1}{N_i}sum_{xinomega_i}x=w^Tmu_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^Tmu_1-w^Tmu_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_{yinomega_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_{xinomega_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_{yinomega_i}(y-tilde{mu})^2\=sum_{xinomega_i}(w^Tx-w^Tmu_i)^2\=sum_{xinomega_i}w^T(x-mu_i)(x-mu_i)^Tw\=w^T(sum_{xinomega_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^Tmu_1-w^Tmu_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_{xinomega_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_{xinomega_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_imu_i μ=N1xx=N1i=1CNiμi
μ i = 1 N i ∑ x ∈ ω i x mu_i=frac{1}{N_i}sum_{xinomega_i}x μi=Ni1xωix
同样的,对于y,我们有
μ i ~ = 1 N i ∑ y ∈ ω i y tilde{mu_i}=frac{1}{N_i}sum_{yinomega_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_{yinomega_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文件

最后

以上就是整齐钢铁侠为你收集整理的数据分析与处理(二)线性判别分析(LDA)线性判别分析多类的情况局限性实验效果的全部内容,希望文章能够帮你解决数据分析与处理(二)线性判别分析(LDA)线性判别分析多类的情况局限性实验效果所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部