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

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

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

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

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

ICA应用前提很简单:数据信号源是独立的且数据非高斯分布(或者信号源中最多只有一个成分是高斯分布),另外观测信号源的数目不能少于源信号数目(为了方便一般要求二者相等即可)。

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

 

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


 

代码运行的结果如下:

ica11

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

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

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

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

FastICA可配置的参数如下:

  1. class 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)


 


 

尾巴

盲源分离中的盲源指的是源信号不可观测且混合特性不可知,很多时候盲源分离(blind signal separation)会被称为独立成分分析,但其实仅当盲源中的不同信号源相互独立时,盲源分离才与独立成分分析等价。因此,独立成分分析是盲源分离的一种特例。因为很多时候,混合信号源是不独立的。


====================【好书推荐,我为自己代言】====================

《电商流量数据化运营》出版了!

  • 10余年业务经验总结:将我在甲方和乙方,跨企业和跨行业的经验总结起来,供大家快速提升,少走弯路。
  • 流量运营教科书:内容围绕流量数据化运营的全流程展开,涵盖渠道策略与计划管理、媒体投放与执行管理、渠道投放效果评估与分析、流量运营监控与效果复盘等各个环节。
  • 有用、实用:不讲数据分析理论,不讲数据分析工具使用,所有方法均可在工作中直接使用,而且围绕流量数据化运营的常见问题展开。
  • 易用、易读:不要求会Python,会用Excel就行,无晦涩难懂的理论和复杂的推导过程。
  • 以场景应用为核心:以业务场景为切入点,内容上围绕业务问题、数据支持方案、实用工具实操的思路,用数据解决每个具体业务问题。
如果你对本书感兴趣,请点击这里查看更多信息!当然,你也可以先加我微信了解一下。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注