scikit-learnのPCAとFastICAの使い方でちょっと個人的にハマったので、やり方をメモしておきます。
Scikit-learnはPythonベースの機械学習ライブラリです。
http://scikit-learn.org/stable/
今回このうちMatrix Factorizationに関する機能を使用し、主成分分析(PCA)と独立成分分析(ICA)を試してみました。
まずPCAの場合、以下のようなコードでかけます。
import numpy as np from sklearn.decomposition import PCA #データのロード(D次元 x データ数N) data = np.load("data.npy") #主成分の数=24 decomposer = PCA(n_components=24) #主成分分析の実施 decomposer.fit(data.T) #平均ベクトル(D次元ベクトル) M = decomposer.mean_ #主成分ベクトル(主成分数xDの行列) V = decomposer.components_ #固有値(各主成分におけるデータの分散) E = decomposer.explained_variance_
独立成分分析について、Scikit-learnではFastICAというアルゴリズムが実装されています。
import numpy as np from sklearn.decomposition import FastICA #データのロード(D次元 x データ数N) data = np.load("data.npy") #独立成分の数=24 decomposer = FastICA(n_components = 24) #データの平均を計算 M = np.mean(data, axis = 1)[:,np.newaxis] #各データから平均を引く data2 = data - M #平均0としたデータに対して、独立成分分析を実施 decomposer.fit(data2) #独立成分ベクトルを取得(D次元 x 独立成分数) S = decomposer.transform(data2) #混合行列の計算(データ数 x 独立性分数) W = decomposer.get_mixing_matrix() #混合行列と独立成分から元の信号dataを復元 X = np.dot(S, W.T) X+=M #混合行列の擬似逆行列を取得 W_inv = decomposer.unmixing_matrix_
PCAとICAで混乱したポイントをいくつか
- FastICAのfit()の引数はPCAのfit()の引数の転置
- 従ってPCAで取得する主成分ベクトルとFastICAで取得する独立成分も転置の関係
- PCAではデータの平均を自動的に計算してくれるが、FastICAではデータを平均0に補正してから実施する必要がある。
というわけでscikit-learnのFastICAを使う人は気をつけましょう。