맹검 소스 분리

Beginner

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

소개

이 실험에서는 혼합 신호에 대한 맹검 소스 분리 (Blind Source Separation) 를 수행하기 위해 FastICA 를 사용합니다. 맹검 소스 분리는 혼합된 신호를 원래의 독립적인 구성 요소로 분리하는 기술입니다. 이는 신호 처리, 이미지 처리 및 데이터 분석과 같은 다양한 분야에서 유용합니다. 파이썬의 scikit-learn 라이브러리를 사용하여 샘플 혼합 신호에 대한 ICA 및 PCA 를 수행할 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

샘플 데이터 생성

세 개의 독립적인 구성 요소로 이루어진 샘플 혼합 신호를 생성합니다. 신호에 노이즈를 추가하고 데이터를 표준화합니다. 또한 세 개의 독립적인 구성 요소를 혼합하는 혼합 행렬을 생성합니다.

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 = [
    "관측치 (혼합 신호)",
    "진짜 소스",
    "ICA 로 복원된 신호",
    "PCA 로 복원된 신호",
]
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 를 사용하여 혼합 신호에 대한 맹검 소스 분리 작업을 성공적으로 수행했습니다. 세 개의 독립적인 구성 요소로 구성된 샘플 혼합 신호를 생성하고, 노이즈를 추가하며, 데이터를 표준화했습니다. 그런 다음 독립적인 구성 요소를 혼합하기 위한 혼합 행렬을 생성했습니다. FastICA 를 사용하여 독립적인 소스를 추정하고, 비교를 위해 PCA 를 계산했습니다. 마지막으로, 원본 혼합 신호, 원본 독립 소스, ICA 로 추정된 소스 및 PCA 로 추정된 소스를 플롯했습니다.