takminの書きっぱなし備忘録 @はてなブログ

主にコンピュータビジョンなど技術について、たまに自分自身のことや思いついたことなど

scikit-learnでPCAとFastICA

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を使う人は気をつけましょう。