Otakuワールドへようこそ![331]独立成分分析はいいぞ! 主成分分析の結果はさらにしゃぶれる
── GrowHair ──

投稿:  著者:



統計学のうちでも、多次元のデータを取り扱うサブジャンルとして、「多変量解析」がある。多変量解析の代表的な手法に、「重回帰分析」、「主成分分析」、「クラスター分析」などがある。最初の二つは、最小二乗法を下敷きにした、古典的な定番手法である。

主成分分析は、1901年にカール・ピアソンによって導入された手法である。これを使うと、与えられたデータが多次元空間においてなす分布をいちばんよく近似する直線を求めることができる。この直線は、分布の多次元的な広がりを1本の直線へと吸い寄せてつぶしたとき、その1次元の分布の分散の値を最大化させる方向を示してもいる。この直線を第1主成分軸という。

主成分分析の実際の計算は、共分散行列を固有値分解するものである。実にスッキリしていて美しい。この簡潔の美ゆえ、比肩しうる別手法が後から台頭してくることはまずあるまいと確信できる。また、変な亜種が出てくる余地がまったくない。長年愛されてきたゆえんである。

並列的に比肩しうる手法はなくても、直列的につないで、分析をさらに先へ進める手法が登場しうるとは、多くの人にとって盲点であった。





「独立成分分析」は1980年代に考案され、1990年代中盤から世界的に広がった、比較的新しい手法である。今回は、これをご紹介したい。

主成分分析は、まだ分析の途中段階にすぎず、さらに分析を進めることができる。結果として、主成分軸とは別に、独立成分軸を抽出することができる。

独立成分分析は、特に、音源分離に適用して、うまくいっている。パーティーなどで大勢の人たちが集まってがやがやしている状況下で、複数のマイクで音を拾い、一人ひとりのしゃべる声を抽出できるというものだ。

それに限らず、主成分分析にかけるのに好適なデータであれば、たいてい独立成分分析にも好適なので、ダメ元で試してみる価値はある。ただし、与えられたデータが、もともと正規分布にしたがう場合はその限りでなく、主成分分析までですでにしゃぶり尽くしており、それ以上しゃぶっても味がしない。

プログラミング言語 Python から呼び出すことができる機械学習のライブラリ "scikit-learn" の中に、FastICA() という関数が用意されている。手持ちのデータを独立成分分析にかけてみるには、この関数を呼び出すだけでよい。難しい中身のことを考えなくて済むので楽チンだ。ただし、バグがあるので、回避のしかたを知っていないと、ひどい目にあう。

●統計学の心は、データから情報を引き出すことにあり

そこに山がなければ登れないのと同様、そこにデータがなければ統計は始まらない。データがそこにあっても、何もしなければ、ただの数字の羅列にすぎない。ただ漫然と眺めていても、何かが見えてくるわけでもなく、頭痛がしてくるだけだ。

データとは、例えば、次のようなものだ。ある大学入試における、各受験者の各科目の得点が、受験者1,000人分とか。複数の地点で同時並行的に計測した気温、湿度、気圧、風速の時間推移とか。被験者100万人分の健康診断結果とか。検査・測定項目には、身長、体重、体温、血液の諸成分量などが含まれる。

データがそこにあれば、その中に、何らかの有益な情報が埋もれているのではあるまいかと期待したくなる。明日の天気を予想したり、特定の病気の診断方法を確立したり、個々人の適性にマッチした職種を薦めたり。

山から粗鉱を採掘してきて製錬して金塊に仕上げるように、データの山を掘り返して有益な情報を抽出するにはどうすればよいか。その方法論を示そうと探究するのが統計学だ。個別のケースに特化するのではなく、汎用性のある手法を打ち出すことを目指す。

こんな分析結果がきっと出るはずだ、という分析者の先入観や、例えば薬効の評価など、こんな結果が出ると都合がよい、という損得勘定に引っ張られる余地を極力排除し、データの分布から何が言えるのかを、そのデータ自身に語らせることを旨とする。

IoT(Internet of Things)の時代が来るとか、来たとか言われている。人ががんばって調査して得られるデータは量的に限界があるが、計測器が吐き出してくるデータを自動的にクラウドに上げる仕組みを構築しておけば、桁違いの量のデータがかき集められる。自動車のドライブレコーダーとか、ネット通販の購入歴とか、ネット検索歴とか、SNSの書き込みとか。

集めただけで何もしなければゴミの山だが、そこから有益な情報が抽出できれば、価値を生む。データの山は宝の山。

●多変量解析は、高次元空間内の分布状態を簡潔に要約する

統計学の中でも特に、多次元のデータを取り扱うのが「多変量解析
(multivariate analysis)」だ。

例えば、国語と算数からなるテストがあり、100人が受験し、得点データが得られているとしよう。受験者一人につき、国語の点数と算数の点数という二つの数値の組の形になっている。これは2次元のベクトルとみることができる。

いま、平面上に横軸と縦軸を引き、横軸が国語の点数を、縦軸が算数の点数を、それぞれ表すものとする。すると、この平面上に、人数分、100個の点を打つことができる。これを散布図という。

では、もし、このテストの科目が国語、算数、理科、社会の4科目だったらどうだろう。得点データは4次元ベクトルの100個の集まりという形をしている。4次元空間に、100個の点をプロットして、同様に散布図が描けるはずである。

しかし、残念ながら、この世は3次元なもんで、次元が足りず、4次元空間がなかなか用意できない。脳内に、という手がなくもないが、「無茶言え!」と言い返されそうだ。データ全体を一望の下に眺め渡す手段がないのである。

この悩みを何とかしようとするのが多変量解析である。多変量解析の提供する機能のひとつに、次元削減がある。

●主成分分析は、高次元空間を回転して、無相関化する

国語と算数のテストの得点の散布図を眺めていると、もしかすると、ドットの散らばりかたが、斜めに右肩上がり傾向になっているかもしれない。このとき、一方の科目の得点が高い子は、他方の科目の得点も高い、という傾向が読み取れる。

国語だけデキて算数はからっきしダメとか、その逆とかも、いるにはいるが、例外的で、ドットの密度はスカスカ。それよりも、2科目とも高得点の子やどっちも低得点の子のほうが圧倒的に多い。

このように、一方が上がれば他方も上がる、右肩上がりの傾向があるとき、両者には正の相関があるという。逆に、一方が上がれば他方が下がる、右肩下がりの傾向があるとき、負の相関があるという。一方の変化が他方に連動する傾向がまったくないとき、無相関であるという。

両者の間に、もし、非常に強い正の相関があったとすると、散布図は、右肩上がりの1本の直線のすぐ近くだけで分布しているはずである。このとき、軸は2本も要らず、1本で済ませておいても、情報損失はほとんどない。

総合的に頭いい軸。あるいは、ふだんからよく勉強している軸。この軸と直交する軸は、将来の専攻科目や職業選択の適性を表す理系─文系軸にあたるのかもしれない。

このように、多次元の分布から、その分布の芯をなす軸を掘り出す手法として、「主成分分析(Principal Component Analysis; PCA)」がある。

主成分分析によって、多次元の分布を最もよく近似する直線を抽出することができる。最良近似の基準として採用するのは、任意の直線のうち、データ各点からその直線に下ろした垂線の足までの二乗和が最小になるもの、という基準である。

図1は、データの各点から、分布の近似直線へ下ろした垂線を表している。
https://photos.app.goo.gl/x3f4KNu2P8j7vhpL7


この問題は解くことができて、結果は次のようになる。与えられた多変量データから、共分散行列を算出することができる。この行列は、必ず半正定値対称行列になっている。このとき、この行列の固有値はすべて非負の実数値をとり、固有ベクトルはすべて互いに直交する。

データの平均を通る直線のうち、その方向ベクトルが、最大固有値に対応する固有ベクトルと一致するものが、求める直線である。この直線を第1主成分軸とよぶ。最大固有値は、この軸方向の分散の値を表す。

固有値を大きい順に並べ、2番目に大きい固有値について同様の軸を求めれば、第2主成分軸となる。第3以下も同様。この計算は、この世が3次元であることとは無関係に、何百次元であっても可能である。

このハーモニーの美にはホレボレする。数学は地上のものではなく、天のものなのだと実感できる。答えがここまで簡潔に表現できるということは、この手法は唯一無二のものであって、これより優れた分析手法が後に発見されることはありえないだろうと確信できる。流行り廃りなく、標準的な分析手法として、何百年でも生き続ける。

主成分分析では、下記のようなことができる。
・データの分布を最良近似する主成分軸を求めることができる
・主成分軸を任意の第kまでで打ち切ることにより、次元削減できる
・空間全体を回転させて、データを無相関化できる
・さらに、各軸方向の分散を1に縮めてデータを「白色化」できる

前置きが長くなった。主成分分析はたしかにド定番の分析手法ではあるけれど、そこが分析の終点ではなく、実は、続きがあるぞ、と主張するのが独立成分分析である。

●独立成分分析は、データの起源にもう一歩迫る

主成分分析が分析の終点になっていて、これ以上進められないのは、元の分布が正規分布にしたがうときに限る。

図2は、元の分布が2次元の正規分布にしたがう例について、主成分分析したようすを示す。左上が元の分布。左下が、それを主成分分析して、得られた主成分軸と、マハラノビス距離が1,2,3の楕円を重ね表示したもの。右上は、それを、主成分軸が横軸と縦軸になるように空間を回転して、無相関化したもの。右下は、縦横それぞれ異なる倍率で変倍をかけ、白色化したもの。
https://photos.app.goo.gl/HucHe1U47uyuFtsF9


この場合、白色化した結果にはもはや何の特徴もなく、これをもってデータがしゃぶり尽くされていることが見てとれる。

図3は、元の分布が、別々の2つの正規分布にしたがう分布を混ぜたものである。今度は、白色化した結果をみると、まだ、分布に芯があるのが見てとれる。この芯を抽出するのが「独立成分分析(Independent Component Analysis; ICA)である。
https://photos.app.goo.gl/FEo6G8TvoM9MAre37


ひとつの部屋の中に音源が3つあるとする。音源とは、3人の人が同時に歌ったりしゃべったりしているのでもいいし、それぞれ別々の楽器を演奏しているのでもいいし、スピーカーが3つ置いてあるのでもいい。それぞれの音源がどんな音を発しているのかは未知とする。

同じ部屋にマイクが3本置いてあるものとする。どのマイクも、3つの音源の発する音を混合した音を拾っているが、その混合比がマイクごとに異なる。マイクに近い音源からの音を大きく拾い、遠い音源からの音を小さく拾うので。

我々は、3本のマイクが拾った音をデータとして取得できている。このとき、混合を元にほどいて、各音源の発している単独の音をそれぞれ抽出することができるか、というのが問題。

もし、混合比が分かっているなら、連立一次方程式を解くような要領で、簡単に解けてしまう。いま、その混合比も未知であるという設定にしておく。そうすると、今度は、条件が足りなくなって、答えが一意に定まらなくなってしまうのではないかという暗雲がただよう。

2つの未知数xとyとを掛け算したら、結果が12になりました。xとyは、それぞれいくつでしょう。という問題と似ている。一方が2だと分かれば他方は6だと分かるし、3なら4だ。しかし、両方とも未知だとしたら、答えの組み合わせは無数にあり、決定できそうにない。

このとき、単独の音と混ざった音とを区別できる基準が何かあると、手掛かりになる。単独の音はピキピキパキパキしている。混ざった音は、もや~んどよ~んとしている。あらゆる混合比の候補の中から、元にほどいたときに最もパッキリしたやつが出てくるのを選べば、それが正解なのではあるまいか。

「中心極限定理」というのがある。元がどんな分布であっても、足し算で混ぜられた分布は、だんだん正規分布に近づいてくると言っている。つまり「もや~ん」とは正規分布のことである。

ということは、任意の分布が正規分布にどれほど似ていないかを示す指標を設け、その基準に照らしていちばん遠いやつを探し出せば、それが、単独の音源が発する純粋な音であろう、となる。これが、独立成分分析の考え方の骨子である。

図4は、主成分分析から、さらに独立成分分析へと進めたようすを表している。左と真ん中の列は先ほどと同じで、右上は、白色化の結果を回転して、横軸と縦軸が独立成分軸になるように向けたものである。右下は、逆変換して、元の分布の上に独立成分軸を重ね表示したものである。主成分軸が互いに直交していたのに対し、独立成分軸どうしは任意の角度をなしうる。
https://photos.app.goo.gl/uzvLTTK2ZV8y4NfHA


無相関性よりも独立性のほうが強い条件である。つまり、分布が独立であれば必ず無相関になるが、逆は必ずしも成り立つとは限らない。感覚的だが、独立性は非常に強い条件であって、無相関な分布をランダムに選んで来たら、それがたまたま独立になっている確率はほぼゼロである。

任意の多次元分布に対して、空間の座標変換として回転だけを許すことにすると、分布を無相関化する回転のしかたは一意に(※)決まる。その無相関な分布がたまたま独立になっていることは、まずない。

※一意性:ただし、共分散行列の固有値が重解をもつ場合を除く。また、選ぶ軸の順番の違いとか、軸のプラスマイナスの向きの違いを別物とみなさず、同一とみなす限りにおいて。

一方、座標変換として、ひしゃげた変換も許すことにして、一般の一次変換まで広げると、無相関化する変換は、無数にある。主成分分析で白色化したあと、どの向きにどれだけ回転しても、無相関性は保たれる。その中から、独立性の最も高いものを選び出すことができる。

まとめると、独立成分分析では、次のようなことができる。
・データの分布を最良近似する独立成分軸を求めることができる
・空間全体を一次変換して、各軸方向の分布を独立に近づけることができる

独立成分分析は、あんまり美しくなく、泥くさいところがある。主成分分析によって無相関化したデータは、元のデータがどんなふうであったとしても、厳密に無相関である。しかし、独立成分分析の結果は、できる限り独立に近づけただけであって、完全な独立にまでは到達していない。

与えられた任意の分布が正規分布からどれほど外れているかを示す基準は、天から降りてくる必然的なものではなく、人が考えて決めるものである。さまざまな基準が提案されており、どれが決定版なのか、何とも言えない。それ次第で結果にも影響するので、センスが問われる。後からもっといいものが提案される可能性が常につきまとう。

どの基準を採択するにしても、解く方法がまた泥くさい。数式的に一般解を得ることができず、個別のケースに応じて数値計算で解く。解に徐々ににじり寄っていく、反復法を採用せざるを得ない。いろいろ美しくなく、独立成分分析は、天のものではなく、地上のものである。

天地論争はともかく、現実世界の実践的な問題に対して、独立成分分析はどれほどの効力を発揮するのだろう。主成分分析では不十分で、独立成分分析ならではの分析結果が得られるのは、どういう事例があるのだろう。

私が不勉強なこともあって、音声分離しか知らない。なので、自信をもってお薦めします、とは言いづらいのだけど、試してみてはいかがでしょうか、ってぐらいの小さい声でほのめかしておきたい。

個人的には、もっと広く、「教師なし学習」が気になっている。赤ん坊が、見たり聞いたり触ったりして世界のありようを徐々に理解していく過程において、親といえども、赤ん坊の脳にまで介入して正解を書き込むわけにはいかないので、自力で学習する以外にない。それは教師なし学習である。

今回の独立成分分析は統計であって、AIとは違うのかもしれないけど、方向的には同類のものを感じる。与えられたデータに対して、自力でどこまでデータのエッセンスへ迫っていけるか。そこが解明されたら、AIは人間にずいぶん似てくるはずだ。人類の知の進歩の展望がみえる。

●ライブラリにバグがある!

プログラミングしていて、ライブラリがバグってたせいでひどい目にあったって経験をした人は、どれくらいいるだろうか。時刻表を調べて、目的の列車に乗りに行ったら、そんな列車はもともとなかったと駅に着いてから判明する、みたいな絶望感が味わえる。祇園精舎の鐘の声。

プログラミング言語Pythonから呼び出すことのできる、機械学習のライブラリ"scikit-learn" の中に、FastICA() という関数が用意されている。

scikit-learn の現時点での最新バージョンは0.23.1である。まだバージョン1ですらないってとこが曲者で、懐胎中であると言える。当分、産まれそうな感じがしないけど。

FastICA() のマニュアルはここにある。
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.FastICA.html


また、独立成分分析の簡単な説明と、呼び出し側のサンプル・プログラムはここにある。
https://scikit-learn.org/stable/auto_examples/decomposition/plot_ica_blind_source_separation.html


FastICA() はバグっている。私の思い違いではない。99.99%、確信がある。なので、しかるべきところにバグ・レポートを書いておいた。ライブラリは不特定多数の人が使う公共の資産だ。他人のプログラムのデバッグという、非常につまらない形でではあるけれど、多少なりとも人類に貢献できるかな、という自負を感じている。現在、絶賛、放置され中。おーーーい!

FastICA() は、引数でwhiten = Trueと指示すれば、データを白色化する前処理もやってくれる。デフォルトがTrueなので、指示しなくてもそうなっているのだが。その白色化する前処理にバグがある。

真面目に計算するなら、共分散行列を固有値分解すべきところ、計算負荷を軽減するためか、データそのものを特異値分解することで代用している。代用してもよいのだが、結果はデータの個数の平方根の倍率がかかっている。それで割っておくのを忘れているのである。

1年以上前、このバグに気づいた人はいるのだが、直しかたがダメで、部分的にしか解決していない。

バグを回避するひとつの手として、白色化を自前のプログラムでやっておく手がある。FastICA() を呼び出す際にはwhiten = Falseと指定し、白色化済みのデータを食わせればよい。

もうひとつは、ライブラリを修正する手である。scikit-learnをインストールすると、しかるべきディレクトリにPythonのソースが置かれる。"_fastica.py" をテキスト・エディタで開いて、なおせばよいのである。どうなおすかは、バグ・レポートに書いておいた。繰り返すが、ぜったい合っている自信がある。
https://github.com/scikit-learn/scikit-learn/issues/17162


●参考文献

独立成分分析を勉強するなら、この書籍が決定版。7,260円という値段と厚みと重量に、伸びかけた手が思わず引っ込むけど。非常に分かりやすく書いてあって、すばらしい。

[1]Aapo Hyvarinen、Juha Karhunen、Erkki Oja、
『詳解独立成分分析 信号解析の新しい世界』東京電機大学出版局(2005/2/1)


【GrowHair】GrowHair@yahoo.co.jp
セーラー服仙人カメコ。アイデンティティ拡散。
http://www.growhair-jk.com/