初次釋出於我的個人文件。(每次都是個人文件優先發布哦)
本文簡要介紹一下主成分分析和因子分析的原理,但是不涉及具體程式碼實現。這是因為現在已經有很多現成的軟體或庫實現了這兩個演算法,讀者只需要一兩句簡單的命令就可以使用了,所以沒有必要在這裡講解。而且你可能會在Python R MATLAB SPSS等多種不同的軟體中使用,無論選哪個軟體的程式碼實現都沒有特別強的代表性。
主成分分析
如果你手上有一組資料,例如是大家的語文數學英語成績。但是現在有一個問題,咱們的試卷出得有那麼一點點不好,大家的成績都集中在一起了,也就是試卷的區分度不大。現在,我們有沒有辦法補救呢?
注意:這只是一個例子而已,自然是不考慮我們進行各種變換之後的現實問題,例如這樣搞成績會不公平啊什麼的。
總之,我們的核心問題是,有沒有辦法對現有資料進行變換,使得資料的每一個個體儘可能被分開。
這就是主成分分析的一個可以選擇的切入點。
那我們要選擇什麼樣的變換呢?以及有沒有辦法將一個群體之間的不同個體距離拉遠。
以p維正態分佈為例進行可行性探索
嗯,對我們先拿p維正態分佈探索一下我們想法的可行性。
我們假設p維隨機向量X服從協方差陣為$\Sigma$,均值向量為$\mu$的p維正態分佈。
那麼X的機率密度函式就是$P(x)=\frac{1}{(2\pi){\frac{p}{2}}|\Sigma|{2}}}e{-\frac{1}{2}(x-\mu)T\Sigma^{-1}(x-\mu)}$,我們來觀察其機率密度等高線,顯然,這裡只有e的指數是變數,所以機率密度等高線滿足:
$$-\frac{1}{2}(x-\mu)T\Sigma(x-\mu)=C_1$$
也就是$(x-\mu)T\Sigma(x-\mu)=C_2$
我們可以對$\Sigma $進行譜分解。
譜分解說明:
根據線性代數的知識我們可以知道,任意實對稱陣A可以正交相似對角化,即
$\forall 實對稱矩陣A,\exist正交陣Q和對角陣\Lambda,使得A=Q\Lambda Q^T$
如果我們已知A的特徵值$\lambda_1,\lambda_2,...,\lambda_n$和對應的特徵向量$e_1,e_2,...,e_n$,則
Q=($e_1,e_2,...,e_n$),$\Lambda =diag(\lambda_1,\lambda_2,...,\lambda_n)$
這意味著:
$$A=Q\Lambda Q^T$$
$$=(e_1,e_2,...,e_n)diag(\lambda_1,\lambda_2,...,\lambda_n)(e_1,e_2,...,e_n)^T$$
$$=(\lambda_1 e_1,\lambda_2 e_2,...,\lambda_n e_n)(e_1,e_2,...,e_n)^T$$
$$=\lambda_1 e_1 e_1^T + \lambda_2 e_2 e_2^T +...+ \lambda_n e_n e_n^T$$
$$=\sum_{i=1}^n\lambda_i e_i e_i^T$$
這就是譜分解了。
我們假設$\Sigma$的特徵值為$\lambda_1,\lambda_2,...,\lambda_p$,對應的特徵向量為$e_1,e_2,...,e_p$,那麼$\Sigma$就可以譜分解為
$\Sigma=\sum_{i=1}^p\lambda_i e_i e_i^T$,將他代入機率密度等高線方程就有,
$(x-\mu)T{(\sum_{i=1}p\lambda_i e_i e_iT)}(x-\mu)=C_2$
也就是,
$$\sum_{i=1}p\frac{[e_i(x-\mu)]T[e_i(x-\mu)]}{C_2}=1$$
這是p維的類似橢圓的方程,當p=2時這就是橢圓方程。
這意味著,機率密度等高線是同樣有著長軸和短軸。
因而,這意味著如果我們將原始變數X進行正交變換將座標軸旋轉到長軸上就可以達成我們的目標將一個群體之間的不同個體距離拉遠。
演算
接下來,我們有了方向就可以進行推演了。
我們要將原始變數X進行正交變換得到新的一組變數,這從幾何看就是進行座標軸旋轉。
總之,從代數角度看就是,設p維隨機向量X=$(x_1,x_2,...,x_p)$的協方差陣為$\Sigma$。
那麼我們就是要找一組新的變數Z=$(z_1,z_2,...,z_p)$使得(新變數被稱為主成分)
$$z_1=a_{11}x_1+a_{12}x_2+...+a_{1p}x_p=a_1^TX$$
$$z_2=a_{21}x_1+a_{22}x_2+...+a_{2p}x_p=a_2^TX$$
...
$$z_p=a_{p1}x_1+a_{p2}x_2+...+a_{pp}x_p=a_p^TX$$
而此時,$var(z_j)=a_j^T\Sigma a_j,cov(z_j,z_k)=a_j^T\Sigma a_k$
我們前面說了,我們希望將一個群體之間的不同個體距離拉遠,也就是要最大化新變數Z的方差,與此同時我們自然希望各個新變數之間無關也就是:
最大化$var(z_j)$,希望$cov(z_j,z_k)=0$
對於$z_1$來說就是希望最大化$a_1^T\Sigma a_1$,但是顯然我們可以透過無限擴大$a_1$的長度來實現最大化$z_1$的方差,這是我們不期望看到的。
所以我們再額外要求$z_1$的長度是1即$a_1^Ta_1=1$。
這樣的話其實我們就是在最大化$a_1^T\Sigma a_1=\frac{a_1^T\Sigma a_1}{a_1^Ta_1}$(注意哦,現在分母為1所以除了等於沒除)。
類似地,我們對$z_2$會要求$a_2Ta_2=1$,並且$cov(z_2,z_1)=a_2T\Sigma a_1=0$
最大化$a_2^T\Sigma a_2$。
以此類推,但是到最後一個變數$z_p$我們只能要求最小化$a_p^T\Sigma a_p$了,因為這個對應的是前面說的高維橢圓的短軸,是最小的。
那麼,怎麼進行最小化呢?
一般的教材這裡就是上拉格朗日乘數法了,計算比較複雜我就不說了。給個結論吧。
$\forall a \in R^p,\Sigma \in M_p且\Sigma為對稱矩陣。$
設$(\lambda_j,e_j)$為$\Sigma$的特徵值、單位特徵向量。
那麼$$a\neq 0, a⊥e_1,e_2,...,e_{j-1},$$
則$$max \frac{a^T\Sigma a}{a^T a}=\lambda_j在a=e_j時取到最大。$$
利用上述結論就可以知道,X的第j個主成分$z_j=e_j^TX$
且$var(z_j)=e_j^T\Sigma e_j$
注意$(\lambda_j,e_j)$為$\Sigma$的特徵值、單位特徵向量。
所以$\Sigma e_j =\lambda_j e_j,e_j^Te_j=1$
因而$var(z_j)=e_j^T\Sigma e_j=e_j^T \lambda_j e_j=\lambda_j e^T_je_j=\lambda_j$。
所以,X的第j個主成分$z_j$是其協方差矩陣$\Sigma$的第j個單位特徵向量乘以原始變數X,並且第j個主成分的方差就是$\Sigma$第j個特徵值$\lambda_j$。
這就是主成分分析的結論。
更進一步的,如果我們對原始變數進行標準化然後再進行主成分分析,可以證明這相當於對原始變數的相關係數矩陣R進行對應的主成分分析。
降維
從上面的推導我們可以看到對p維向量進行主成分分析只能得到p個主成分,似乎不能降維啊。那麼我們一般說的降維是怎麼回事?
前面我們知道,第j個主成分的方差就是$\Sigma$第j個特徵值$\lambda_j$。
如果我們將全部的主成分的方差求和,那就是對$\Sigma$全部的特徵值的求和,也就是$\Sigma$的跡,也就是X各個分量的方差的和。
所以到現在為止我們還沒有損失任何一點點方差。
如果降維的話就會損失方差了,這是因為所謂的降維就是將各個特徵值從大到小排列,然後去掉比較小的特徵值和對應的主成分。
這樣的話就會損失方差了,也就損失了部分資訊。這就是所謂的利用主成分分析進行降維。
因子分析
那麼因子分析是什麼?
還是看學生成績資料吧,從學生的成績上我們可以看到,優秀的學生似乎各科成績都很好。也許你還會發現,各科成績高度相關,這意味著他們可能由某一個潛在變數決定(智商)。
因子分析就是由原始資料尋找這樣的潛變數。
由於潛變數的數量往往少於原始變數的數量,所以因子分析也是一種降維方法。
因子分析建立了一個因子模型,它認為原始變數Y是各個潛變數的線性組合,即
$$Y_i=l_{i1}F_1+l_{i2}F_2+...+l_{im}F_m+\epsilon_i$$
其中,$F_j$是潛變數也叫公共因子,我們假設有m個,當然一般要求m不大於原始變數的個數p。
係數$l_ij$被稱為因子載荷,$Y_i$則是原始變數而$\epsilon_i$是類似誤差的特殊因子。
我們還對公共因子提了一些基礎的要求,首先$F_i,F_j$不相關(正交),$F_i,\epsilon_j、\epsilon_i,\epsilon_j$不相關,來保持各個變數之間的獨立性。
當然,因子模型用矩陣表示更簡潔,就是
$Y=AF+\epsilon$
那前面說的那些要求用矩陣表示就是:
- $m \le p$
- cov(F,$\epsilon$)=0
- $D_F=var(F)=單位陣I_m$
- $D_\epsilon=var(\epsilon)=diag(\sigma_12,\sigma_22,...,\sigma_p^2) $
而因子模型最重要的新增是協方差陣的矩陣分解:
$var(X)=\Sigma=cov(AF+\epsilon,AF+\epsilon)=Acov(F,F)A{-1}+cov(\epsilon,\epsilon)=AA+D_\epsilon$
演算
那麼如何求解因子模型中未知的A和$\epsilon$呢?
答案是利用協方差矩陣的矩陣分解:
$\Sigma=AA^{-1}+D_\epsilon$
而前面我們說過$\Sigma$可以分解為$Q\Lambda Q^T$,其中$Q=($e_1,e_2,...,e_n$),$$\Lambda =diag(\lambda_1,\lambda_2,...,\lambda_n)$
我們再進行小小的變換,定義$\Lambda_2=(e_1\sqrt{\lambda_1},e_2\sqrt{\lambda_2},...,e_p\sqrt{\lambda_p})$,
則$\Sigma=\Lambda_2 \Lambda_2$。
當$\Sigma$的後p-m個特徵值很小的時候,我們就可以忽略掉後面的項,用$\Lambda_2$的前m項估計A,從而$D_\epsilon=\Sigma-AA^{-1}$也就可以計算了。
這就是因子分析的主成分法求解。
主軸因子法
除此之外因子分析還有一個常用的演算法是主軸因子法,推導比較複雜我就只說思路了。
我們知道
$\Sigma=AA^{-1}+D_\epsilon$
那麼如果我們先估計$D_\epsilon$在分解也可以得到A。
總思路是這樣的,不過如果你去翻閱各種資料的話,可能還會遇到約相關陣的說法,
也就是先把原始變數進行標準化從而$\Sigma=原始變數的相關係數R$再定義$R*=R-D_\epsilon=AA$,
然後估計$R^*$再計算A和$D_\epsilon$也是可以的。