简介
在本实验中,我们将使用快速独立成分分析(FastICA)对混合信号进行盲源分离。盲源分离是一种用于将混合信号分离为其原始独立成分的技术。这在信号处理、图像处理和数据分析等各个领域都很有用。我们将使用 Python 的 scikit-learn 库对一个示例混合信号执行独立成分分析(ICA)和主成分分析(PCA)。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 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 = FastICA(n_components=3, whiten="arbitrary-variance")
S_ = ica.fit_transform(X) ## 重构信号
A_ = ica.mixing_ ## 获取估计的混合矩阵
## 我们可以通过反转解混来“证明”独立成分分析模型是适用的。
assert np.allclose(X, np.dot(S_, A_.T) + ica.mean_)
## 为作比较,计算主成分分析
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 = [
"观测值(混合信号)",
"真实源",
"独立成分分析恢复的信号",
"主成分分析恢复的信号"
]
colors = ["红色", "钢蓝色", "橙色"]
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)对混合信号进行了盲源分离。我们生成了一个由三个独立成分组成的示例混合信号,添加了噪声,并对数据进行了标准化处理。然后,我们生成了一个混合矩阵来混合我们的独立成分。我们使用快速独立成分分析来估计独立源,并计算主成分分析以作比较。最后,我们绘制了原始混合信号、原始独立源、通过独立成分分析估计的源以及通过主成分分析估计的源。