主成分分析とか

主成分分析について入門する。

こちらのサイト

  • 相関のある多数の変数から、相関のない少数で全体のばらつきを最もよく表す主成分と呼ばれる変数を合成する多変量解析の手法の1つとある。
  • 少ない変数で全体のばらつきを表現したい、つまり、変数の絞り込みをする、という見方もある。
  • 腎臓の機能とタンパク質の発現量と疾患、というデータのセットがあったときに、その散らばり具合を、低次元で表現したときに使える。
  • 第一主成分の分散を最大化し、次の主成分はそれまでの主成分と直交する、という縛りのもとで、分散を最大化する。(貪欲法みたいなイメージ)
  • 直交する、ので、正規直交基底のように、観測値のセットを線形結合で表せる。
  • 主成分ベクトルが共分散行列の固有ベクトルで、共分散行列が実対称である。
    • ここで実対称行列なら、固有ベクトルが直交する、という話がでてきた。こらは、有限次元のスペクトル定理による
    • 任意の実対称行列は、直交行列によって対角化可能である
    • また、実対称行列Aが対称であるのは、 D=Q^TAQが実対称行列となる実直交行列Qが存在するとき、かつそのときに限る
  • データの視覚化や、主成分ベクトルのなす空間への射影、という意味合い。
  • 主成分分析は、共分散行列や相関行列に対する固有値分解、データ行列の特異値分解による。
  • 主成分分析の結果の、主成分得点は基底ベクトルにかかる係数。
  • 主成分負荷量は、主成分と観測値の相関係数
  • 第1主成分
    •  w_1 = argmax\frac{||Xw||^2}{||w||^2}
  • 他の主成分
    •  \hat{X_k} = X - \Sigma_{s=1}^{k-1} Xw_s w_s^T

ここで、ちょっと外れる。

  • まず、データの相関行列を取る。詳しくはこちら
    • 相関行列は、対角成分は1、他の成分は相関係数、からなる
    • 相関行列は、分散共分散行列と関わる。
    • 相関行列は、半正定値。
  • 寄与率とは、分散の比である。
  • 主成分得点は、データ点と負荷量ベクトルとの内積

 

 

ここで、こちらのサイトを参考にしつつ、3次元でお絵かきしつつ、PCAをする。

 

#PCA
import numpy as np 
import pandas as pd
import urllib.request
import matplotlib.pyplot as plt 
%matplotlib inline
import sklearn
from sklearn.decomposition import PCA

urllib.request.urlretrieve(url, 'wine.txt') 
df = pd.read_csv("wine.txt", sep="\t", index_col=0)
dfs = df.iloc[:, 1:].apply(lambda x: (x-x.mean())/x.std(), axis=0)
pca = PCA()
pca.fit(dfs)
feature = pca.transform(dfs)
pd.DataFrame(feature, columns=["PC{}".format(x+1) for x in range(len(dfs.columns))]).head()
from mpl_toolkits.mplot3d import Axes3D
# グラフの枠を作成
fig = plt.figure()
ax = Axes3D(fig)

# X,Y,Z軸にラベルを設定
ax.set_xlabel("PC1")
ax.set_ylabel("PC2")
ax.set_zlabel("PC3")

# .plotで描画
ax.scatter(feature[:, 0],feature[:, 1],feature[:, 2],c=list(df.iloc[:, 0]),linestyle='None')

# 最後に.show()を書いてグラフ表示
plt.show()

f:id:medical-science:20211224235546p:plain

PCAを使えば、散らばりが大きいように、次元削減できるのは分かった。でも、もう少しちゃんと解りたい。

  • 高次元(複数次元)データ点がある。
  • それを低次元へ射影したい。
  • まず、平均を0に、標準偏差を標準化する。(スケールを合わせる)
  • そこで、分散共分散行列をとる。(実質相関行列)
  • これを固有値分解して、固有値固有ベクトルの対を得る。
  • この固有値の大きい物から、固有ベクトルを取る。
  • この固有ベクトルと、もとのデータの内積をとって、座標とする。
  • この座標を点の座標に置き換えて、プロットすればよい。

 

 

バイバイ!