盲源分离

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将使用快速独立成分分析(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)对混合信号进行了盲源分离。我们生成了一个由三个独立成分组成的示例混合信号,添加了噪声,并对数据进行了标准化处理。然后,我们生成了一个混合矩阵来混合我们的独立成分。我们使用快速独立成分分析来估计独立源,并计算主成分分析以作比较。最后,我们绘制了原始混合信号、原始独立源、通过独立成分分析估计的源以及通过主成分分析估计的源。