ブラインドソース分離

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、FastICA を使って混合信号に対してブラインドソース分離を行います。ブラインドソース分離は、混合信号を元の独立成分に分離するために使われる技術です。これは、信号処理、画像処理、データ分析などの様々な分野で役立ちます。サンプルの混合信号に対して ICA と PCA を行うために、Python の scikit-learn ライブラリを使います。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替えて、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に直面した場合は、Labby に質問してください。セッション後にフィードバックを提供してください。そうすれば、迅速に問題を解決します。

サンプルデータの生成

3 つの独立成分からなるサンプルの混合信号を生成します。信号にノイズを加え、データを標準化します。また、3 つの独立成分を混合するための混合行列も生成します。

import numpy as np
from scipy import signal

np.random.seed(0)
n_samples = 2000
time = np.linspace(0, 8, n_samples)

s1 = np.sin(2 * time)  ## 信号 1: 正弦波信号
s2 = np.sign(np.sin(3 * time))  ## 信号 2: 方形波信号
s3 = signal.sawtooth(2 * np.pi * time)  ## 信号 3: のこぎり波信号

S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape)  ## ノイズを加える

S /= S.std(axis=0)  ## データを標準化する
## データを混合する
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]])  ## 混合行列
X = np.dot(S, A.T)  ## 観測値を生成する

ICA と PCA モデルの適合

独立成分を推定するために FastICA を使います。その後、比較のために PCA を計算します。

from sklearn.decomposition import FastICA, PCA

## ICA を計算する
ica = FastICA(n_components=3, whiten="arbitrary-variance")
S_ = ica.fit_transform(X)  ## 信号を再構築する
A_ = ica.mixing_  ## 推定された混合行列を取得する

## アンミキシングを元に戻すことで ICA モデルが適用されることを「証明」できます。
assert np.allclose(X, np.dot(S_, A_.T) + ica.mean_)

## 比較のために、PCA を計算する
pca = PCA(n_components=3)
H = pca.fit_transform(X)  ## 直交成分に基づいて信号を再構築する

結果のプロット

元の混合信号、元の独立成分、ICA によって推定された成分、および PCA によって推定された成分をプロットします。

import matplotlib.pyplot as plt

plt.figure()

models = [X, S, S_, H]
names = [
    "Observations (mixed signal)",
    "True Sources",
    "ICA recovered signals",
    "PCA recovered signals",
]
colors = ["red", "steelblue", "orange"]

for ii, (model, name) in enumerate(zip(models, names), 1):
    plt.subplot(4, 1, ii)
    plt.title(name)
    for sig, color in zip(model.T, colors):
        plt.plot(sig, color=color)

plt.tight_layout()
plt.show()

まとめ

FastICA と PCA を使って、混合信号に対してブラインドソース分離を成功裏に行いました。3 つの独立成分からなるサンプルの混合信号を生成し、ノイズを加え、データを標準化しました。その後、独立成分を混合するための混合行列を生成しました。独立成分を推定するために FastICA を使い、比較のために PCA を計算しました。最後に、元の混合信号、元の独立成分、ICA によって推定された成分、および PCA によって推定された成分をプロットしました。