소개
이 실험에서는 혼합 신호에 대한 맹검 소스 분리 (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 로 추정된 소스를 플롯했습니다.