独立成分分析(ICA)とは?カクテルパーティー問題を図解でわかりやすく解説

パーティー会場で複数の人が同時に話しているのに、私たちは聞きたい相手の声だけを不思議と聞き分けられます。では、部屋の数カ所に置いたマイクが録った「複数の声が混ざった音」から、元の一人ひとりの声をコンピュータで分離できるでしょうか? 話者が何人いて、どんな配置で、どんな強さで混ざったか——何もわからないまま、混ざった観測だけから元の信号を復元する。この一見無茶な問題を解く手法が 独立成分分析(ICA: Independent Component Analysis) です。

ICAが立てる仮定はたった一つ、「元の信号どうしは統計的に独立」というものだけです。それだけを頼りに、混合の仕組み(混合行列)も元信号も同時に推定します。この「教師なしで混合を解きほぐす」性質から、ICAは驚くほど広い分野で使われています。

  • 脳波(EEG)・fMRIの解析:頭皮上の多数の電極が拾う混ざった脳活動から、独立な脳源や、まばたき・心拍などのアーティファクトを分離する
  • 音源分離(ブラインド音源分離):混ざった音から個々の音源を取り出す
  • 金融・画像:観測データの背後にある独立な要因(潜在因子・独立な画像特徴)を抽出する

この記事では、ICAの心臓部を次の順で解き明かします。

  • なぜ PCA では分離できず、ICA なら分離できる のか(2次統計 vs 高次統計)
  • 「独立性」と「非ガウス性」を結ぶ 中心極限定理 の直感
  • 前処理としての 白色化(whitening) が問題をどう単純化するか
  • 非ガウス性の尺度(尖度・ネゲントロピー)と FastICA アルゴリズム
  • ICAが原理的に決められない 2つのあいまいさ
  • Python(scikit-learn の FastICA)で混合信号を実際に分離する

前提知識

この記事を読む前に、以下を読んでおくと理解が深まります。

ICAとは — 混ざった信号を「独立性」だけで解きほぐす

まず全体像をつかみましょう。ICAが解くのは次のような状況です。

カクテルパーティー問題の概念図。複数話者の声がマイクで混合され、ICAで復元する

複数の音源(話者)が同時に音を出し、それを複数のマイクが拾います。各マイクには全話者の声が、距離に応じた強さで混ざって入ります。私たちが手にできるのは、この混ざった観測だけ。ここから元の各話者の声を復元するのがゴールです。混合の強さ(誰の声がどのマイクにどれだけ入ったか)も、元の声そのものも、どちらも未知——だから「ブラインド(盲目的)音源分離」と呼ばれます。

数式でのモデル化

$n$ 個の独立な源信号をベクトル $\bm{s} = (s_1, \dots, s_n)^\top$、$n$ 個の観測を $\bm{x} = (x_1, \dots, x_n)^\top$ とします。ICAは、観測が源信号の線形混合だと仮定します。

$$ \begin{equation} \bm{x} = A \bm{s} \end{equation} $$

ここで $A$ は $n \times n$ の 混合行列(mixing matrix) で、これも未知です。目標は、$A$ も $\bm{s}$ も知らないまま、観測 $\bm{x}$ だけから 分離行列(unmixing matrix) $W \approx A^{-1}$ を推定し、

$$ \bm{y} = W \bm{x} \approx \bm{s} $$

として源信号を復元することです。

観測x=As の行列関係図。未知の混合行列Aと独立な源信号sから観測が生じる

図のとおり、観測 $\bm{x}$ は「独立な源信号 $\bm{s}$ を混合行列 $A$ でかき混ぜたもの」というのがモデルの心臓部です。未知数が $A$($n^2$ 個)と $\bm{s}$(各時刻 $n$ 個)の両方にあるので、普通に考えれば解けません。それを可能にするのが「$\bm{s}$ の成分は互いに独立」という強い仮定です。次に、この独立性がなぜ手がかりになるのかを見ていきます。

なぜPCAでは分離できないのか

「データの構造を見つける」と聞くと、まず主成分分析(PCA)を思い浮かべる人が多いでしょう。しかしPCAとICAは、見ているものが根本的に違います。

PCAは分散が最大になる直交軸を見つけ、成分を無相関にします。無相関とは共分散がゼロ、つまり2次の統計量までを整える操作です。一方 ICAは成分を統計的に独立にします。独立は無相関よりずっと強い条件で、あらゆる次数の統計量(3次、4次…の高次統計量)まで含めて「関係がない」ことを要求します。

この違いが、分離できるかどうかを分けます。実際に、2つの独立な信号を混ぜたデータを散布図にして、PCAとICAがそれぞれどんな軸を見つけるか比べてみましょう。

PCAは直交軸しか見つけられず、ICAは非直交な真の独立軸を見抜くことを示す散布図

観測データ(灰色)は平行四辺形のように広がっています。これは2つの独立な一様分布を混ぜたためで、データの「辺」の方向こそが元の独立成分の方向です。ところが PCA(赤)は必ず直交する軸しか選べない ため、平行四辺形の辺には沿えず、斜めにずれた向きを向いてしまいます。対して ICA(シアン)は非直交でも構わず、平行四辺形の辺=真の独立軸をきちんと見抜きます

無相関化しかしないPCAでは、混合が直交でない限り分離しきれない。独立性を要求するICAだからこそ、非直交の真の方向を復元できる——これが両者の決定的な差です。では、その「独立性」をどうやって数値的な手がかりに変えるのでしょうか。鍵は意外にも、統計学で最も有名な定理にあります。

独立性の手がかりは「非ガウス性」— 中心極限定理

ICAの最も美しいアイデアは、独立性を直接測る代わりに「非ガウス性」を最大化するという発想の転換です。その根拠が中心極限定理です。

中心極限定理は「独立な確率変数をたくさん足し合わせると、その和はガウス分布(正規分布)に近づく」と述べます。実際に、一様分布を平均する個数を増やしていくと、分布がみるみるガウスに近づく様子を見てみましょう。

中心極限定理により独立成分を混ぜるほどガウス分布に近づくヒストグラム

1個のときは平らな一様分布ですが、2個、5個、20個と平均する数を増やすと、釣鐘型のガウスに近づいていきます。ここで観測モデル $\bm{x} = A\bm{s}$ を思い出してください。観測 $x_i$ は複数の独立な源信号 $s_j$ の重み付き和です。つまり、混合された観測は、元の各源信号よりもガウスに近いはずです。

この事実を逆向きに使います。分離を試みる方向ベクトル $\bm{w}$ をいろいろ変えて $y = \bm{w}^\top \bm{x}$ を作ると、$y$ は源信号たちの線形結合です。$y$ が最もガウスから遠く(=最も非ガウスに)なるとき、それは源信号のどれか1つだけを取り出せた瞬間だ、と考えられます。混ぜればガウスに近づくのだから、逆にガウスから最も遠ざける方向が「混ざりを解いた」方向なのです。

ICAの核心:源信号の1つを復元する = $\bm{w}^\top\bm{x}$ の非ガウス性を最大化する $\bm{w}$ を見つける。

ただしこの論法には重要な例外があります。源信号が2つ以上ガウス分布だと、ICAは分離できません。ガウスはいくら回転させても分布の形が変わらないため、「非ガウス性を最大化する特別な方向」が存在しないのです。ICAが効くのは源信号が非ガウスであることが前提、と覚えておきましょう。

非ガウス性を最大化すればよいと分かりました。ではそれを測る前に、探索を劇的に楽にする前処理を導入します。

前処理:白色化(whitening)で問題を回転だけに絞る

いきなり任意の分離行列 $W$ を探すのは大変です。そこで多くのICAは、まず 白色化(whitening) という前処理を行います。白色化とは、データを線形変換して各成分を無相関にし、分散を1に揃える操作です。これはまさにPCAで実現できます。

まず観測を中心化(平均を引く)し、共分散行列 $\bm{\Sigma}$ を固有値分解 $\bm{\Sigma} = E D E^\top$ して、

$$ \bm{x}_{\text{white}} = E D^{-1/2} E^\top \bm{x}_{\text{centered}} $$

とすれば、変換後の共分散は単位行列になります。図で効果を見てみましょう。

白色化の前後。相関のある傾いた楕円が無相関で分散1の球状分布になる

白色化まえ(左)はデータが傾いた楕円状で、相関があり各方向の分散もバラバラです。白色化あと(右)は円(球)状になり、無相関で分散が1に揃います。ここが重要なポイントです。球状のデータに残された自由度は「回転」だけ。白色化のあとの分離行列は直交行列(回転)に限定できるので、ICAの探索は「どの角度に回せば非ガウス性が最大になるか」という、はるかに易しい問題に化けます。

白色化で下準備が整いました。次は、肝心の「非ガウス性」を具体的にどう数値化するかです。

非ガウス性の尺度 — 尖度とネゲントロピー

非ガウス性を最大化するには、それを測る物差しが要ります。代表的なものが2つあります。

尖度(kurtosis)

尖度は分布の「尖り具合」を表す4次の統計量で、ガウス分布を基準(超過尖度ゼロ)にします。

$$ \mathrm{kurt}(y) = \mathbb{E}[y^4] – 3\big(\mathbb{E}[y^2]\big)^2 $$

分散を1に正規化すれば $\mathrm{kurt}(y) = \mathbb{E}[y^4] – 3$ です。値の符号で分布の性格が分かれます。

尖度による分布の分類。ラプラス(尖度>0)、ガウス(基準)、一様(尖度<0)の比較

図のように、ラプラス分布のように中心が尖って裾が重い分布は 尖度 > 0(super-gaussian)、一様分布のように平らで裾が短い分布は 尖度 < 0(sub-gaussian)、ガウスはちょうど 0 です。尖度の絶対値が大きいほどガウスから遠い=非ガウス性が高い、という指標になります。尖度は計算が簡単ですが、外れ値に弱いという弱点もあります。

ネゲントロピー(negentropy)

より頑健な尺度が ネゲントロピー です。情報理論では、分散が同じ分布の中でガウス分布がエントロピーを最大にすることが知られています。そこで、あるガウス分布とのエントロピー差

$$ J(y) = H(y_{\text{gauss}}) – H(y) $$

をネゲントロピーと呼びます。$J(y) \geq 0$ で、$y$ がガウスのとき0、ガウスから離れるほど大きくなります。理論的には理想的ですが、確率密度が必要で計算が重いため、実用では近似式(例:$J(y) \approx [\mathbb{E}[G(y)] – \mathbb{E}[G(y_{\text{gauss}})]]^2$、$G$ は $\log\cosh$ など)を使います。この近似こそ、次のFastICAが用いる物差しです。

尺度が決まれば、あとはそれを最大化するだけ。その高速な最適化アルゴリズムがFastICAです。

FastICAアルゴリズム

FastICA は、白色化したデータに対して非ガウス性を最大化する方向 $\bm{w}$ を、不動点反復(fixed-point iteration)で高速に求めるアルゴリズムです。1成分を求める更新式は次の形です。

$$ \bm{w} \leftarrow \mathbb{E}\big[\bm{x}\, g(\bm{w}^\top \bm{x})\big] – \mathbb{E}\big[g'(\bm{w}^\top \bm{x})\big]\,\bm{w} $$

その後 $\bm{w} \leftarrow \bm{w} / \lVert \bm{w} \rVert$ と正規化します。ここで $g$ は非線形関数で、ネゲントロピー近似の微分に対応します($g(u) = \tanh(u)$ や $g(u) = u^3$ がよく使われます)。$g(u) = u^3$ を選ぶと尖度ベースの更新に一致します。

直感的には、この更新は「今の方向で作った $y = \bm{w}^\top\bm{x}$ の非ガウス性が上がる向きへ $\bm{w}$ を少し回す」操作を繰り返しています。白色化のおかげで探索が回転に限られているため、収束は非常に速く、ふつう数回〜十数回の反復で決まります。

FastICAの不動点反復で非ガウス性(尖度の絶対値)が数回で収束する様子

図は、白色化したデータで1つの分離方向を FastICA で求めたときの、反復ごとの非ガウス性(尖度の絶対値)の推移です。わずか数回の反復で非ガウス性が急上昇し、頭打ち=収束しているのが分かります。複数成分を求めるときは、各 $\bm{w}$ を直交化しながら順に、あるいは並行して求めます(1成分ずつ求めると前の成分と直交させる、対称直交化で同時に求める、などの方式があります)。

アルゴリズムが分かったところで、ICAが原理的に「ここまでしか決められない」限界も押さえておきましょう。

ICAの2つのあいまいさ

ICAは万能ではなく、原理的に決められない量が2つあります。これは手法の欠陥ではなく、問題設定そのものに内在する曖昧さです。

ICAのスケール不定性と順序不定性、およびガウス分離不能を示す図

1つ目は スケール(と符号)の不定性 です。$\bm{x} = A\bm{s}$ は、任意の定数 $c$ に対して $\bm{x} = (A/c)(c\bm{s})$ とも書けます。源信号を $c$ 倍しても混合行列を $1/c$ 倍すれば観測は変わらないので、各成分の振幅や符号は決まりません。復元された波形が上下反転していたり、大きさが違ったりするのはこのためです。

2つ目は 順序の不定性 です。どの独立成分を「1番目」と呼ぶかに決まりはないので、復元される成分の並び順は元と入れ替わりうることになります。

さらに前述のとおり、源信号が2つ以上ガウス分布だと分離不能です。これは非ガウス性という手がかりが消えるためでした。とはいえ実用上は、私たちが知りたいのはたいてい「各源信号の波形の形」であって、絶対的な振幅や並び順ではありません。だからこれらのあいまいさが問題になることは多くありません。

理屈が揃ったので、実際にPythonで混ざった信号を分離してみましょう。

Pythonでの実装 — 混合信号をFastICAで分離する

scikit-learn の FastICA を使って、3つの源信号を混ぜてから復元します。まず源信号を作り、混合行列でかき混ぜます。

import numpy as np
from scipy import signal as sp_signal
from sklearn.decomposition import FastICA, PCA

np.random.seed(0)
n = 2000
t = np.linspace(0, 8, n)

# 3つの独立な源信号: 正弦波・矩形波・のこぎり波
s1 = np.sin(2 * t)
s2 = np.sign(np.sin(3 * t))
s3 = sp_signal.sawtooth(2 * np.pi * t)
S = np.c_[s1, s2, s3]
S += 0.05 * np.random.randn(*S.shape)  # わずかな観測雑音
S /= S.std(axis=0)                      # 分散を揃える

# 混合行列で観測を作る
A = np.array([[1.0, 1.0, 1.0],
              [0.5, 2.0, 1.0],
              [1.5, 1.0, 2.0]])
X = S @ A.T   # 観測 x = A s

これで、3つの波形が混ざった観測 X ができました。次に FastICA で分離します。scikit-learn の実装は、内部で白色化まで自動的に行ってくれます。

# ICAで分離
ica = FastICA(n_components=3, random_state=0, whiten="unit-variance", max_iter=1000)
S_ica = ica.fit_transform(X)   # 復元された源信号

# 比較用にPCAでも分解
pca = PCA(n_components=3)
S_pca = pca.fit_transform(X)

源信号・観測・復元結果の波形を並べてみましょう。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(3, 3, figsize=(11, 6))
titles = ["source s", "observed x", "ICA recovered y"]
for j, D in enumerate([S, X, S_ica]):
    for i in range(3):
        axes[i, j].plot(D[:600, i], lw=0.8)
        if i == 0:
            axes[i, j].set_title(titles[j])
plt.tight_layout()
plt.show()

源信号・観測・ICA復元の波形3x3。混合で崩れた波形がICAで元の形に戻る

このグラフがICAの威力を最もよく物語っています。左列の源信号(正弦波・矩形波・のこぎり波)が、中央列では互いに混ざり合ってどれも似たような複雑な波形になっています。ところが右列のICA復元では、元の3つの波形がくっきり取り戻されています。順序が元と入れ替わっているのは、前述の「順序の不定性」がそのまま現れたものです。振幅や符号が違うのも「スケールの不定性」どおりです。

分離がどれだけ正確かを、源信号と復元信号の相関で定量的に確かめます。

from scipy.stats import kurtosis

# 各源信号に最も対応する復元成分との相関(絶対値)
corr = np.abs(np.corrcoef(S.T, S_ica.T)[:3, 3:])
print("源信号 vs 復元 の最大相関:", np.round(corr.max(axis=1), 3))
print("源信号の尖度:", np.round(kurtosis(S, axis=0), 2))
print("観測の尖度  :", np.round(kurtosis(X, axis=0), 2))

実行すると、次のような出力が得られます。

源信号 vs 復元 の最大相関: [0.997 0.999 0.997]
源信号の尖度: [-1.35 -1.98 -1.19]
観測の尖度  : [-0.49 -1.2  -0.43]

相関はすべて 0.99以上で、3つの源信号がほぼ完璧に復元できたことが分かります。さらに注目すべきは尖度です。源信号の尖度(-1.35, -1.98, -1.19)は絶対値が大きく非ガウス的ですが、混ぜた観測の尖度(-0.49, -1.2, -0.43)は0に近づいてガウスに寄っているのが読み取れます。中心極限定理どおり「混ぜるとガウスに近づく」ことが数値でも確認でき、ICAがその逆をたどって分離していることが腑に落ちます。

最後に、独立性が混合で失われ、ICAで回復する様子を散布図で見ておきましょう。

fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, D, tt in zip(axes, [S, X, S_ica],
                     ["source", "observed", "ICA recovered"]):
    ax.scatter(D[:, 0], D[:, 1], s=3, alpha=0.35)
    ax.set_title(tt)
plt.tight_layout()
plt.show()

源信号・観測・ICA復元の散布図。混合で潰れた独立構造がICAで復元される

源信号の散布図(左)は、2成分が独立なので四角く広がります。観測(中央)では混合によって斜めに引き伸ばされ、成分間に相関が生まれています。ICA復元(右)では再び四角い独立な広がりに戻っており、混合で潰れた独立構造をICAが回復したことが視覚的に確認できます。

まとめ

本記事では、独立成分分析(ICA)を、原理から実装まで解説しました。

  • 問題設定:観測 $\bm{x} = A\bm{s}$ から、混合行列 $A$ も源信号 $\bm{s}$ も未知のまま、「源信号は独立」という仮定だけで $\bm{s}$ を復元する(ブラインド音源分離)。
  • PCAとの違い:PCAは無相関化(2次統計)で直交軸しか見つけられない。ICAは独立化(高次統計)で非直交な真の独立軸を見抜く。
  • 核心のアイデア:中心極限定理より「混合はガウスに近づく」。だから逆に 非ガウス性を最大化する方向が源信号を復元する方向。ただし源信号が2つ以上ガウスだと分離不能。
  • 前処理:白色化(無相関化+分散1)で、探索を回転だけの問題に単純化する。
  • 尺度とアルゴリズム:非ガウス性を尖度やネゲントロピーで測り、FastICAの不動点反復で高速に最大化する。
  • あいまいさ:スケール(符号)と順序は原理的に決まらないが、波形の形は復元できるので実用上は問題になりにくい。

ICAは「独立性」というたった一つの仮定から、混ざったデータの背後にある構造を「盲目的に」取り出す、教師なし学習の中でも際立って美しい手法です。信号処理・脳科学・画像・金融まで、観測が独立な要因の重ね合わせだと考えられる場面ならどこでも活躍します。

次のステップとして、以下の記事も参考にしてください。

主成分分析(PCA)とは?次元削減の仕組みをわかりやすく解説
分散最大の直交軸を見つけるPCA。ICAの白色化にも使う基礎で、両者の違いを理解する出発点。
相互情報量とは?2変数の依存関係を測る情報量
独立性の度合いを測る情報理論の指標。ICAが最小化したい『成分間の依存』の数学的背景。