Numpy scipyで独立成分分析

9,611 views

Published on

0 Comments
25 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,611
On SlideShare
0
From Embeds
0
Number of Embeds
205
Actions
Shares
0
Downloads
106
Comments
0
Likes
25
Embeds 0
No embeds

No notes for slide

Numpy scipyで独立成分分析

  1. 1. Numpy/Scipyで 独立成分分析2011年8月28日第1回Tokyo.Scipy @sfchaos
  2. 2. 目次1. 自己紹介2. 独立成分分析3. Numpy/Scipyを用いた実装4. まとめ 1
  3. 3. 目次1. 自己紹介2. 独立成分分析3. Numpy/Scipyを用いた実装4. まとめ 2
  4. 4. 1.1 プロフィール� TwitterID: @sfchaos� 職業:コンサルタント � 金融工学のモデル構築・データ解析 � 最近,大規模データ解析の企画に着手 (Hadoop, Mahout, CEP等) 3
  5. 5. 1.2 RとPythonと私� R歴:4年 � 「Rパッケージガイドブック」(東京図書,2011年4月)執筆. � bigmemoryパッケージ(大規模データの管理・分析) � RTisean/tseriesChaosパッケージ(非線形(カオス)時系列解析) � Tokyo.R 翻訳プロジェクト Wiki � Tokyo.Rの方々と各種マニュアルの翻訳 4
  6. 6. � Python歴:薄く1年(Numpy/Scipy歴1ヶ月)� Rでは大規模データの扱いが大変なので,代替となる手 段がないか模索中 → PythonでのHPCに興味があります.� 今回は,Numpy/Scipyの勉強のために発表させていた だきます(独立成分分析自体も初心者). 5
  7. 7. 目次1. 自己紹介2. 独立成分分析3. Numpy/Scipyを用いた実装4. まとめ 6
  8. 8. 2.1 独立成分分析の概要� 未知音源分離問題(Blind Source Separation, BSS).  観測信号から元の信号の成分を取り出す問題.カクテ ルパーティー効果など.� 脳磁波の解析,音声処理などで使用されている(らし い). 独立成分分析では, 観測信号のみから原信号を推定 原信号1 観測信号1 原信号i 重ね合わせ 観測信号i 原信号N 観測信号N 7
  9. 9. 2.2 無相関性と独立性� 日常用語では無相関も独立も同じ意味で使われること が多い� しかし,両者の数学的な定義は異なり,独立⊆無相関 確率変数 x1と x2 が無相関 無相関 E[ x1 x 2 ] = E[ x1 ]E[ x 2 ] 独立 確率変数 x1と x2 が独立 p1, 2 ( x1 , x2 ) = p1 ( x1 ) p2 ( x2 ) 8
  10. 10. � 原信号がそれぞれ正規分布に従う場合は,「無相関= 独立」となり,主成分分析を行えば元信号を取り出せる.� 主成分分析は,各主成分が正規分布に従うと仮定して おり,正規分布に従う変数を線形結合した変数も正規 分布に従うことに注意(PRML 第12章,2章). 9
  11. 11. � しかし,原信号が正規分布に従わない場合,線形結合 した変数同士が無相関だが独立ではないことがある. 観測信号は無相関だが 原信号は無相関かつ独立 独立ではない ⎛ s1 ⎞ 原信号の重ね合わせ ⎛ x1 ⎞ ⎛ s1 ⎞ ⎜ ⎟ ⎜s ⎟ ⎜ ⎟= ⎜x ⎟ A⎜ ⎟ ⎜s ⎟ ⎝ 2⎠ ⎛ 2 3⎞ ⎝ 2⎠ ⎝ 2⎠ A=⎜ ⎜ 2 1⎟ ⎟ ⎝ ⎠ p( x1 , x 2 ) ≠ p1 ( x1 ) p2 ( x 2 ) 10
  12. 12. 11
  13. 13. � このような場合,主成分分析を行っても無相関ではある が独立ではない原信号が得られてしまう. 無相関だが独立ではない 12
  14. 14. � このような観測信号から,独立な原信号の成分を抽出 することが独立成分分析の目的. 観測信号 原信号 独立 ⎛ x1 ⎞ ⎛ x1 ⎞ ⎜ ⎟ ⎜x ⎟ W⎜ ⎟ ⎜x ⎟ ⎝ 2⎠ W ⎝ 2⎠ 13
  15. 15. 2.3 独立成分の抽出� 目標:この2つの方向を取り出すこと� 目で見れば一目瞭然だが,機械的に抽出したい 観測信号 14
  16. 16. 2.3.1 独立性� 独立な方向を特徴付ける指標を定義したい.� 実は,分布の非正規性を最大化することが独立成分を 求めることと等価であることが分かっている(きちんとし た議論は「詳解独立成分分析」を参照).� 非正規性を特徴付ける指標はいろいろある. 概要尖度(の絶対値) � 4次のモーメント � 正規分布では3次以上のキュムラントはゼロであり,尖度が大き いほど正規分布から離れていることになるネゲントロピー � 正規分布は平均と分散が一定の分布の中で最も情報量が大き い(ランダムである)ことに着目 � 正規分布と対象とする分布の情報量の差をネゲントロピーとして 定義 � ネゲントロピーが大きい分布ほど正規分布から離れていることに なる 他にも,相互情報量などがある. 15
  17. 17. � 尖度(4次のモーメント) ( x) = E[ x ] − 3{E[ x ]} − 4 E[ x ]E[ x] + 12 E[ x ]{E[ x]} − 6{E[ x]} 4 2 2 3 2 2 4 κ4� ネゲントロピー J ( y ) = H ( y gauss ) − H ( y ), H ( y ) = − ∫ p ( y ) log p( y ) dy p( y ) :分布の確率密度関数ネゲントロピーを計算するためには確率密度関数を近似する必要が あるので,後ほど近似関数を導入する. 16
  18. 18. 2.3.3 独立成分抽出のアイディア� 求めたい独立成分の個数分だけ,非正規性の指標が 大きい方向を最適化により求める. wi (0) w (i j ) ・・・ 非正規性の指標 max E[ g i ( yi )], i = 1,… , N yi = wi x s.t. wi = 1. 17
  19. 19. � これは,観測信号に対して任意の線形変換を行い,独 立な成分を探すという問題であり,自由度が大きいため 大変. ? 18
  20. 20. � そこで,独立⊆無相関という関係に着目する.� 観測信号を無相関にしておけば,独立な成分を探索す るためには直交変換だけを対象とすればO.K.� 主成分分析を用いて,観測信号を直交する成分に変換 しておく(白色化,whitening, sphering) 白色化 z = Vx 19
  21. 21. 白色化x z = Vx z 独立成分の 抽出 y = Wz 20
  22. 22. 2.4 FastICAアルゴリズム� 収束が速い(3次収束).� 最適化手法としてNewton法を使用.� 独立性の指標は,ネゲントロピーを使用. max E[ g i ( y i )], i = 1,… , N λ T yi = wi x E[ g i ( y i )] + w i w i = max . s.t . w i = 1. 2 21
  23. 23. λ T E[ g i ( yi )] + w i w i = max . 2上式を微分すると,次の方程式の解を求める問題に帰着する. f ( x i ) = E[ x i g i ( yi )] + λw i = 0.Newton法を用いて,重みベクトルを求める. w i( k +1) = w i( k ) − f ( z i ) / f ( z i ) E ( z i g ( w i( k ) )) + λw i( k ) = w i( k ) − T E ( g ( w i( k ) z i )) + λ T ∝ E ( z i g ( w i( k ) ) w i( k ) ) − E ( g ( w i( k ) z i ))ネゲントロピーは,以下の式で近似することが多い. g1 ( y ) = tanh(ay ), g 2 ( y ) = y exp(− y 2 / 2), g 3 ( y ) = y 3 , 22
  24. 24. FastICAp : 推定する独立成分の個数, m :独立成分のカウンタ(初期値=1)1.(中心化) データを中心が原点になるように変換する: 1 n x i = x i − ∑ x j n j =12.(白色化)   を白色化(主成分分析)して,データ点 i を得る: x z i3. 各独立成分に対するの射影方向  p の初期値をランダムに与える.wm=1, 2, ・・・, p に対して以下を行う. w4. 次式に従って   p を更新する: w p ← E[ z i g ( w T ) w p ] − E[ g ( w T ) z i ] p p p −15. 次式に従ってを正規直交化する: w p − ∑ (w T w p )w j j j =1 wp ← p −1 w p − ∑ (w T w p )w j j j =16. w pが収束していない場合は,step.4に戻る.7. mを1つインクリメントし,の場合はstep.4に戻る. 23
  25. 25. 目次1. 自己紹介2. 独立成分分析3. Numpy/Scipyを用いた実装4. まとめ 24
  26. 26. 3. Numpy/Scipyを用いた実装� Pythonには,MDPやscikitsなど独立成分分析を行う パッケージが既にある.� ここでは,Numpy/Scipyを用いてFastICAアルゴリズム を実装する. 25
  27. 27. 3.1 使用するNumpy/Scipyの機能・関数� numpy.arrayオブジェクト等を使用して,行列演算,乱数 生成等にNumpy, Scipyを使用する. 機能 関数 特異値分解 linalg.svd関数(Numpy linglg)行列演算 (主成分分析の中で使用) ベクトルの正規化 linalg.norm関数(Numpy )乱数生成 乱数生成 random.normal関数(Numpy) 26
  28. 28. 3.2 ソースコードimport numpy as npimport scipy as spimport pylabfrom scipy import linalg# FastICAdef fastICA(x, n_comp, alpha=1.0, maxit=200, tol=1e-4): n, p = x.shape# step.1 観測信号の中心化 x = x - x.mean(axis=0)# step.2 白色化(主成分分析) v = np.dot(x.T, x)/n u, sigma, v = linalg.svd(v) # 特異値分解 D = np.diag(1/np.sqrt(sigma))  V = np.dot(D, u.T) # 白色化行列の生成 V = V[0:n_comp, 0:p] # 成分の個数 z = np.dot(V, x.T).T # 白色化を実行してベクトルzを得る# step.3 射影ベクトルの初期化 w_init = np.random.normal(loc=0, scale=1, size=(n_comp, n_comp)) 27
  29. 29. # step.4-7 減次法によるFastICAの実行 w = ica_deflation(z, n_comp, alpha, maxit, tol, w_init) # 復元信号 s = np.dot(w, z.T).T pylab.scatter(s[:, 0], s[:, 1]) pylab.xlabel("$y_{1}$", fontsize=30) pylab.ylabel("$y_{2}$", fontsize=30) pylab.savefig("../output/scatter_estimated_sources.png") pylab.show() pylab.close() return s 28
  30. 30. # 減次法によるFastICAdef ica_deflation(x, n_comp, alpha, maxit, tol, w_init): n, p = x.shape # 求める射影ベクトルの結果を格納するオブジェクト w_res = np.zeros((n_comp, n_comp)) # step.4-7 各独立成分を求める for i in np.arange(n_comp): w = w_init[i, ].T t = np.zeros((n_comp, np.size(w))) # 既に求められている独立成分と直交するように変換 if i > 0: k = np.dot(w_res[0:i, ], w) t = (w_res[0:i, ].T * k).T w -= t.sum(axis=0) w /= np.linalg.norm(w) 29
  31. 31. # 誤差,反復回数カウンタの初期化 lim = np.repeat(1000.0, maxit); it = 0 # 独立成分の探索 while lim[it] > tol and it < maxit: # step.4 wpの更新 wx = np.dot(x, w) gwx = np.tanh(alpha * wx) gwx = np.repeat(gwx, n_comp).reshape(np.size(gwx), n_comp) xgwx = x * gwx v1 = xgwx.mean(axis=0) g_wx = alpha * (1 - (np.tanh(alpha * wx))**2) v2 = np.dot(np.mean(g_wx), w) w1 = v1 - v2 it += 1 t = np.zeros((n_comp, np.size(w))) # step.5 Gram-Schmidtの正規直交化 if i > 0: k = np.dot(w_res[0:i, ], w1) t = (w_res[0:i, ].T * k).T w1 -= t.sum(axis=0); w1 /= np.linalg.norm(w1) # step.6 収束判定 lim[it] = abs(abs(sum(w1 * w)) - 1.0) w = w1 w_res[i, ] = wreturn w_res 30
  32. 32. 3.3 独立成分の方向への収束の確認 w1 w2 (4回で収束) (正規直交化するため, 1回で収束する) ① ② ③ ④ 31
  33. 33. 3.4 原信号に関して復元できるとは限らない性質� 原信号の順番 1番目の 2番目の 1番目の 独立成分 独立成分 独立成分 2番目の 独立成分 32
  34. 34. � 原信号の符号と強度 � 正負が逆転する可能性がある. � 射影ベクトルを単位ベクトルとしているため,波形は原信号と 相似形のものが得られ,強度は復元されない可能性がある. 2番目の 1番目の 2番目の 1番目の 独立成分 独立成分 独立成分 独立成分 2番目の 2番目の 1番目の 1番目の 独立成分 独立成分 独立成分 独立成分 33
  35. 35. 目次1. 自己紹介2. 独立成分分析3. Numpy/Scipyを用いた実装4. まとめ 34
  36. 36. 4. まとめ� 独立成分分析は,観測された信号から独立な原信号 の成分を抽出するための多変量解析手法.� 代表的なアルゴリズムであるFastICAをNumpy/Scipyを 使って実装した.� Rに比べてNumpy/Scipyが勝っている点は・・・ → これを見つけることが今後の課題 35
  37. 37. 参考文献� 「詳解 独立成分分析」� 朱鷺の杜 Numpy� NumPy for R (and S-Plus) users RユーザがPythonの該当関数を調べるのに便利. http://mathesaurus.sourceforge.net/r-numpy.html 36
  38. 38. ご清聴ありがとうございました 37

×