次元削除にて膨大なデータの主成分を探す。固有値分解はここで使います。
データセット読み込み
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import preprocessing, decomposition # データセット読み込み df_wine_all=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)
df_wine_all.head(4)
取り込んだワインデータは前処理済みのもので先頭4行を抽出した結果は以下の通りとなる。
取り込んだワインを表示 0 1 2 3 4 5 ... 8 9 10 11 12 13 0 1 14.23 1.71 2.43 15.6 127 ... 0.28 2.29 5.64 1.04 3.92 1065 1 1 13.20 1.78 2.14 11.2 100 ... 0.26 1.28 4.38 1.05 3.40 1050 2 1 13.16 2.36 2.67 18.6 101 ... 0.30 2.81 5.68 1.03 3.17 1185 3 1 14.37 1.95 2.50 16.8 113 ... 0.24 2.18 7.80 0.86 3.45 1480 [4 rows x 14 columns]
入力とラベルに分ける
X=df_wine_all.iloc[:,1:].values Y=df_wine_all.iloc[:,0].values
print(X)
特徴リストの出力
[[1.423e+01 1.710e+00 2.430e+00 ... 1.040e+00 3.920e+00 1.065e+03] [1.320e+01 1.780e+00 2.140e+00 ... 1.050e+00 3.400e+00 1.050e+03] [1.316e+01 2.360e+00 2.670e+00 ... 1.030e+00 3.170e+00 1.185e+03] ~snip~ ]
print(Y)
ラベルリストの出力
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]
データの整形
sc=preprocessing.StandardScaler() # 標準化(平均0、分散1) sc.fit(X) X=sc.transform(X)
X
データを平均0、分散1(デフォルト)になるように整形します
array([[ 1.51861254, -0.5622498 , 0.23205254, ..., 0.36217728, 1.84791957, 1.01300893], [ 0.24628963, -0.49941338, -0.82799632, ..., 0.40605066, 1.1134493 , 0.96524152],
PCAを実行
6次元に次元圧縮する
pca = decomposition.PCA(n_components=6) X_transformed = pca.fit_transform(X)
X_transformed
array([[ 3.18562979e+02, 2.14921307e+01, 3.13073470e+00, -2.50113758e-01, 6.77078222e-01, 5.68081040e-01], [ 3.03097420e+02, -5.36471768e+00, 6.82283550e+00, -8.64034749e-01, -4.86095978e-01, 1.43398712e-02],
結果の表示
print(pca.explained_variance_)
print(pca.components_)
# 固有値λに相当 [4.73243698 2.51108093 1.45424187 0.92416587 0.85804868 0.64528221] # 固有ベクトルvに相当(6次元) [[ 0.1443294 -0.24518758 -0.00205106 -0.23932041 0.14199204 0.39466085 0.4229343 -0.2985331 0.31342949 -0.0886167 0.29671456 0.37616741 0.28675223] [-0.48365155 -0.22493093 -0.31606881 0.0105905 -0.299634 -0.06503951 0.00335981 -0.02877949 -0.03930172 -0.52999567 0.27923515 0.16449619 -0.36490283] ]
print(np.cumsum(pca.explained_variance_ratio_))
累積寄与率:どれだけ次元を削減したか(7~8割が目安)
[0.36198848 0.55406338 0.66529969 0.73598999 0.80162293 0.85098116]
結果のプロット
plt.subplot(2, 1, 2) plt.scatter(X[:,9],X[:,12], c=Y) plt.xlabel('color') plt.ylabel('proline') plt.show
%matplotlib inline plt.figure(figsize=(10,10)) plt.subplot(2, 1, 1) plt.scatter(X_transformed[:,0],X_transformed[:,1], c=Y) plt.xlabel('PC1') plt.ylabel('PC2')
PC1:第1成分
PC2:第2成分
以上