主成分分析 python, sklearn

六月份似乎太忙,將近一個月沒有寫博客,於是挑一個多元統計分析中的方法寫一篇 python 操作實現的。

主成分分析(Principle Component Analysis, PCA)是數據降維的一個方法:原始的統計數據中有很多變量,可以採用主成分分析方法將原始數據降維爲少數幾個變量的數據。

主成分分析的求解一般採用特徵根分解,即求解原始數據協方差矩陣或相關係數矩陣最大特徵根對應的特徵向量,即爲第一主成分,第二主成分爲第二大特徵根對應的特徵向量,其他的主成分可以依次得出。主成分貢獻率爲對應特徵根佔所有特徵根加和的比例。(更嚴謹的可以說通過奇異值分解求主成分)

採用 python 主成分分析時,常用的包爲 Sklearn,其他一些包也能做(例如 matplotlib.mlab.PCA)。需要注意的是

  • 最好對原始數據進行標準化
  • sklearn 計算主成分時使用的是協方差矩陣,而不是相關係數矩陣。

舉例,下面一個統計數據:

食品 衣着 居住 家庭設備 交通通訊 文教娛樂 醫療保健 其他
北 京 1736 379 854 327 615 797 504 103
天 津 1171 257 614 117 328 329 179 40
河 北 888 156 399 101 222 226 135 39
山 西 830 202 201 69 160 280 103 33
內蒙古 1054 150 335 84 293 309 176 44
遼 寧 1127 221 378 100 301 377 234 68
吉 林 1003 168 257 82 285 261 194 56
黑龍江 924 184 527 74 257 277 254 49
上 海 2684 366 1320 458 748 937 562 204
江 蘇 1569 191 512 168 364 479 199 85
浙 江 2061 319 914 260 618 723 416 121
安 徽 1000 117 345 106 197 257 134 41
福 建 1518 187 457 154 366 357 154 100
江 西 1221 125 326 96 230 276 155 56
山 東 1088 160 446 137 294 377 188 46
河 南 859 132 318 83 160 178 123 39
湖 北 1192 125 310 110 223 272 135 62
湖 南 1433 128 307 114 219 329 168 58
廣 東 1789 144 530 152 412 361 204 116
廣 西 1187 79 380 95 214 226 123 44
海 南 1135 66 146 92 178 199 93 60
重 慶 1130 96 231 96 163 250 143 33
四 川 1244 116 234 102 172 225 144 36
貴 州 820 80 236 62 99 161 72 24
雲 南 976 80 226 67 100 183 122 35
西 藏 1185 182 84 81 79 28 44 39
陝 西 813 124 212 84 163 297 166 38
甘 肅 859 92 241 74 155 258 114 27
青 海 893 156 329 84 208 110 152 43
寧 夏 923 143 346 77 178 178 199 51
新 疆 804 171 333 68 183 159 169 36

對其主成分分析的 Python 代碼爲:

from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
import pandas as pd
import numpy as np


df = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\data-pca.xlsx', index_col=0) # 讀取數據
data = scale(df.values) # 標準化,標準化之後就自動根據協方差矩陣進行主成分分析了
# data2 = np.corrcoef(np.transpose(data)) # 沒有必要單獨計算協方差陣或相關係數陣
pca = PCA() # 可以調整主成分個數,n_components = 1
pca.fit(data)
print(pca.explained_variance_) # 輸出特徵根
print(pca.explained_variance_ratio_) # 輸出解釋方差比
print(pca.components_) # 輸出主成分

輸出結果:

[7.32679152 0.46898546 0.16208403 0.1035709 0.07520292 0.06908562
0.04006575 0.02088048]

[0.88630543 0.05673211 0.01960694 0.01252874 0.00909713 0.00835713
0.00484666 0.00252586]

[[ 0.34197826 0.32541509 0.36029958 0.36486138 0.3682146 0.36096996
0.35616496 0.34854195]
[ 0.54451489 -0.61527353 -0.11520953 0.11674732 -0.03494752 -0.07480108
-0.2943857 0.4522824 ]
[ 0.27960446 0.69192655 -0.19973533 -0.07235855 -0.02963776 -0.42452329
-0.39881297 0.24037227]
[-0.21745238 -0.1359657 0.65924912 -0.30353519 0.15040126 -0.53935545
0.07814873 0.29639958]
[-0.15267545 -0.0164215 -0.46139281 -0.58549298 0.44015111 0.1955926
0.1948895 0.38828316]
[ 0.16110958 -0.00739226 0.32020717 -0.29565015 0.42815873 0.33310541
-0.60500836 -0.35175729]
[ 0.63371524 -0.02206104 -0.01490419 -0.36536854 0.00175525 -0.23513962
0.46603443 -0.43785863]
[-0.10113902 -0.13222512 -0.25839752 0.43837388 0.68017775 -0.4341369
0.01092949 -0.2492196 ]]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章