추천 게시물

파이썬 (Python) 독립 성분 분석 (ICA) 예제 코드

목차

파이썬으로 독립 성분 분석 (Independent component analysis, 이하 ICA)를 활용하여 독립 성분을 추출하는 예제 코드이다. 실행하기 전에 numpy, matplotlib, sklearn을 미리 설치 해야한다.

  • pip install numpy
  • pip install scikit-learn
  • pip install numpy

아래는 파이썬 코드이다. 두 성분 X, Y가 서로 다른 비율로 조합되어 생성된 신호 A, B를 만들고, 두 신호를 fastICA로 분리하고 잘 분리가 되었는지 Plot으로 확인한다.


import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import FastICA

# 샘플 데이터 생성
np.random.seed(0)
time = np.linspace(0, 1, 500)
X = np.sin(2 * np.pi * 7 * time)  # X 성분 (주파수 7Hz)
Y = np.sin(2 * np.pi * 13 * time) # Y 성분 (주파수 13Hz)

# 실제 신호 A, B 생성
A = 0.5 * X + 0.2 * Y + 0.05
B = 0.1 * X + 0.4 * Y + 0.05

# 두 신호를 행렬로 만듭니다 (2 x N)
signals = np.c_[A, B]

# 독립 성분 분석 (ICA)
ica = FastICA(n_components=2)
components = ica.fit_transform(signals)

# 분리된 신호 플롯
plt.figure(figsize=(10, 10))

# Original A Signal
plt.subplot(4, 1, 1)
plt.plot(time, A, label='Original A Signal')
plt.legend()
plt.title('Original Signals and ICA Components')

# Original B Signal
plt.subplot(4, 1, 2)
plt.plot(time, B, label='Original B Signal')
plt.legend()

# ICA Components
plt.subplot(4, 1, 3)
plt.plot(time, components[:, 0], label='ICA Component 1')
plt.plot(time, components[:, 1], label='ICA Component 2')
plt.legend()

# Original X and Y vs. ICA Components
plt.subplot(4, 1, 4)
plt.plot(time, X, label='Original X Signal')
plt.plot(time, Y, label='Original Y Signal')
plt.plot(time, components[:, 0], '--', label='ICA Component 1 (Dashed)')
plt.plot(time, components[:, 1], '--', label='ICA Component 2 (Dashed)')
plt.legend()

plt.tight_layout()
plt.show()

# 상관계수 출력
corr_1_x = np.corrcoef(components[:, 0], X)[0, 1]
corr_1_y = np.corrcoef(components[:, 0], Y)[0, 1]
corr_2_x = np.corrcoef(components[:, 1], X)[0, 1]
corr_2_y = np.corrcoef(components[:, 1], Y)[0, 1]

print(f"ICA Component 1과 X 성분의 상관계수: {corr_1_x:.2f}")
print(f"ICA Component 1과 Y 성분의 상관계수: {corr_1_y:.2f}")
print(f"ICA Component 2과 X 성분의 상관계수: {corr_2_x:.2f}")
print(f"ICA Component 2과 Y 성분의 상관계수: {corr_2_y:.2f}")


댓글