主成分分析的原理
主成分分析是將眾多的變量轉換為少數幾個不相關的綜合變量,同時不影響原來變量反映的信息,實現數學降維。
如何獲取綜合變量?
通過指標加權來定義和計算綜合指標:
其中 \(X_1, X_2 ... X_n\) 是原來的指標, \(Y_1\) 是綜合指標。\(a_{11}, a_{12} ... a_{1n}\) 是加權系數。\(a_{1j}\)反應了 \(X_j\) 隨機變量對於 \(Y_1\) 隨機變量的重要程度。
如何確定反應信息不受影響?
我們用方差來反應轉換前后的隨機變量所包含的信息。所以,如果要使 $ Y_1 $ 包含原變量的所有信息,則需要滿足等式:
如果 \(Y_1\) 不能滿足原變量所表示的信息,就構造一個 \(Y_2\) :
然后滿足等式:
如果還不滿足所i傲視的信息,就構造 \(Y_3\) ,依次類推,最多構造到 \(Y_n\) 一定會滿足。
原因:若 $ X_i $ 都線性無關,則需要構造到 \(Y_n\) 才能滿足,如果 $ X_i $ 線性相關,則構造 $ Y $ 的個數一定小於n。
一般的,我們並不需要完全滿足,只需要滿足85%以上即可(特殊需求除外)。假若構造k個變量能滿足條件,則只需要:
變量之間的相關性可以從相關系數矩陣來考察。以上的工作就是將原變量的相關系數矩陣通過變化,使得變換后的變量的相關系數矩陣非對角線上的元素變為0。同時,原變量相關系數矩陣的特征值等於變換后的變量的相關系數矩陣對角線之和。
個人理解
非對角線上元素變為0表示變換后 $ Y_i $ 與 $ Y_j $ 元素互不相關( i 不等於 j )。
原變量相關系數矩陣的特征值等於變換后的變量的相關系數矩陣對角線之和表示方差之和等於原方差。
主成分分析的數學模型
設 $ p $ 維隨機變量 $ X=(x_1, x_2, ... , x_p)^T $ ,其協方差矩陣為:
變量 $ x_1,x_2,...,x_p $ 經過線性變換后得到新的綜合變量 $ Y_1,Y_2,...,Y_p $ ,即:
其中系數 $ l_i=(l_{i1},l_{i2},...,l_{ip})(i=1,2,...,p) $ 為常數向量。要滿足以下條件:
則稱 \(Y_1\) 為第一主成分, \(Y_2\) 為第二主成分,以此類推, \(Y_p\) 為第 \(p\) 個主成分。這里 \(l_{ij}\) 稱為成分系數。
個人理解
(1) 中等於1的目的是為了讓 \(X\) 變換到 \(Y\) 的過程中不會增加或者缺少信息,相當於乘以了一個單位向量。
(2) 中不同 \(Y\) 的協方差等於0表示轉換后的向量之間兩兩相關性無關。
(3) 中將主成分從大到小排列是為了找到表示原來信息量最多的主成分。
主成分分析的性質與定理
個人理解
這個定理就是再用這組數據的協方差矩陣的特征向量和特征值求主成分和主成分的方差。
主成分:每一個單位正交特征向量就是x前面的系數。
方差:每一個單位特征向量對應的特征值就是它的方差。方差越大,貢獻率越大。
定理 設 \(p\) 維隨機變量 \(X\) 的協方差矩陣 \(\Sigma\) 的特征值滿足 \(\lambda_1 \ge \lambda_2 \ge ... \ge \lambda_p\) ,響應的單位正交向量為 \(e_1, e_2, ... , e_p\) ,則 \(X\) 的第 \(i\) 個主成分為:
其中 \(e_i=(e_{i1},e_{i2},...e_{ip})^T\) ,且:
推論 若記 \(Y=(Y_1,Y_2,...,Y_p)^T\) 為主成分向量,矩陣 \(P=(e_1,e_2,...,e_p)\) ,則 \(Y=P^TX\) ,且 \(Y\) 的協方差矩陣為:
主成分的總方差為:
所以計算貢獻率:
Python代碼實現
代碼如下:(別忘了使用前要歸一化)
from sklearn.decompostition import PCA
pca = PCA(n_components=0.95) # 貢獻率
pca.fit(data) # data 表示訓練的數據
Y = pca.transform(data) # Y:表示主成分值的矩陣
tzxl = pca.components_ # 特征向量
tz = pca.explained_variance_ # 特征值
gxl = pca.explained_variance_ratio_ # 貢獻率
根據主成分分析計算綜合排名,綜合排名公式如下:
其中 \(g_i\) 表示貢獻率, \(Y_i\) 表示主成分。計算代碼如下:
F = np.matmul(Y, gxl.T)
Rs = pd.Series(F, tag_list).sort_values(asending=False)
# tag_lis t表示對應的標簽字符串矩陣 eg: [北京,上海,天津 ... ]