机器学习&数据挖掘

独立成分分析Independent component analysis(ICA)

Author
宋天龙
发布于 2015-05-12
6268 次阅读
0 次赞
0 次分享
独立成分分析Independent component analysis(ICA)
AI 智能核心导读

独立成分分析(ICA)是一种专为非高斯分布数据集设计的降维与信号分离技术。其核心假设为信号源统计独立,是解决“鸡尾酒会”等盲源分离问题的经典方法,广泛应用于语音识别与生物医学等领域。相比主成分分析(PCA),ICA能更精准地从混合观测数据中重构出独立的原始信号。结合Python的FastICA算法实战,进一步验证了其在复杂信号分离中的卓越性能。

独立成分分析(ICA)详解:原理、应用与 Python 实战

什么是独立成分分析(ICA)?

传统的降维方法(包括 PCA、LDA 等)都是以观测数据点呈高斯分布模型为基本假设前提的。在已经先验经验知道观测数据集为非高斯分布模型的前提下,PCA 和 LDA 的降维效果并不好。而本文介绍的 ICA 将适用于非高斯分析数据集,它是 ICA,是主成分分析(PCA)和因子分析(Factor Analysis)的一种有效扩展。

独立成分分析(Independent Component Analysis,简称 ICA)是一种利用统计原理进行计算的方法。它是一个线性变换,这个变换把数据或信号分离成统计独立的非高斯的信号源的线性组合

ICA 的核心假设与应用前提

独立成分分析的最重要的假设就是信号源统计独立,并且这个假设在大多数盲信号分离(Blind Signal Separation)的情况中符合实际情况。但即使当该假设不满足时,仍然可以用独立成分分析来把观察信号统计独立化,从而进一步分析数据的特性。

独立成分分析并不能完全恢复信号源的具体数值,也不能解出信号源的正负符号、信号的级数或者信号的数值范围,它能做的是将不同独立的信号源进行按照特征进行分离。

ICA 的应用前提很简单,主要包含以下三点:

  • 数据信号源是独立的
  • 数据呈非高斯分布(或者信号源中最多只有一个成分是高斯分布)。
  • 观测信号源的数目不能少于源信号数目(为了方便,一般要求二者相等即可)。

经典场景与应用领域

ICA 的经典问题是**“鸡尾酒会问题”**(Cocktail Party Problem)。这个问题假设在 Party(或鸡尾酒会)中有 n 个人,我们利用房间里面的 n 个麦克风或录音机对同时说话的这些人进行录音,由此得到一个混合信号源或声音源。现在要做的就是从这个信号源中分离出不同人的说话声音。

独立成分分析法(ICA)最初就是用来解决“鸡尾酒会”的问题。ICA 基于信号高阶统计特性的分析方法,经 ICA 分解出的各信号成分(或者叫分量)之间是相互独立的。正是因为这一特点,ICA 在信号处理领域受到了广泛的关注。除了经典的盲源分离外,它的应用领域还包括:

  • 图像识别:去除噪音信息。
  • 语言识别:分离音源并去除噪音(如去除噪音只保留输入语音)。
  • 通信与生物医学信号处理:从这些信号中单独区分某些信号(如区分胎儿和孕妇的心电信号)。
  • 故障诊断:去除非自然信息。
  • 特征提取和降维
  • 自然信息处理:如地震声音分离。

Python 实战:FastICA 与 PCA 的效果对比

下面应用 Python 机器学习库 Scikit-Learn(SKlearn)中的 FastICA 来演示信号分离,并与 PCA 进行对比的案例。

python
1import numpy as np 2import matplotlib.pyplot as plt 3from scipy import signal 4from sklearn.decomposition import FastICA, PCA 5 6# 生成观测模拟数据 7np.random.seed(0) 8n_samples = 2000 9time = np.linspace(0, 8, n_samples) 10s1 = np.sin(2 * time) # 信号源 1 : 正弦信号 11s2 = np.sign(np.sin(3 * time)) # 信号源 2 : 方形信号 12s3 = signal.sawtooth(2 * np.pi * time) # 信号源 3 : 锯齿波信号 13S = np.c_[s1, s2, s3] 14S += 0.2 * np.random.normal(size=S.shape) # 增加噪音数据 15S /= S.std(axis=0) # 标准化 16 17# 混合数据 18A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]]) # 混合矩阵 19X = np.dot(S, A.T) # 生成观测信号源 20 21# ICA 模型 22ica = FastICA(n_components=3) 23S_ = ica.fit_transform(X) # 重构信号 24A_ = ica.mixing_ # 获得估计混合后的矩阵 25 26# PCA 模型 27pca = PCA(n_components=3) 28H = pca.fit_transform(X) # 基于 PCA 的成分正交重构信号源 29 30# 图形展示 31plt.figure() 32models = [X, S, S_, H] 33names = ['Observations (mixed signal)', 'True Sources', 'ICA recovered signals', 'PCA recovered signals'] 34colors = ['red', 'steelblue', 'orange'] 35 36for ii, (model, name) in enumerate(zip(models, names), 1): 37 plt.subplot(4, 1, ii) 38 plt.title(name) 39 for sig, color in zip(model.T, colors): 40 plt.plot(sig, color=color) 41 plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.46) 42 43plt.show()

代码运行的结果如下:

ica11
ica11

由结果可知,原始观测信号源有 3 种独立信号源混合(正弦、方形和锯齿波形)。通过 ICA 可以较好地分离出三种信号源,而 PCA 的分离效果不佳,只分离出一个信号源。

FastICA 可配置的参数如下:

python
1class sklearn.decomposition.FastICA(n_components=None, algorithm='parallel', whiten=True, fun='logcosh', fun_args=None, max_iter=200, tol=0.0001, w_init=None, random_state=None)

总结与延伸:盲源分离与 ICA 的关系

盲源分离中的“盲源”指的是源信号不可观测且混合特性不可知。很多时候盲源分离(Blind Signal Separation)会被称为独立成分分析,但其实仅当盲源中的不同信号源相互独立时,盲源分离才与独立成分分析等价

因此,独立成分分析是盲源分离的一种特例。因为在很多实际场景中,混合信号源往往是不独立的。

分享
最后修订: 2015-05-12