独立成分分析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)会被称为独立成分分析,但其实仅当盲源中的不同信号源相互独立时,盲源分离才与独立成分分析等价。因此,独立成分分析是盲源分离的一种特例。因为很多时候,混合信号源是不独立的。


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

《Python数据分析与数据化运营》上市啦!

50+数据流工作知识点
14个数据分析与挖掘主题
8个综合性运营分析案例
涵盖会员、商品、流量、内容4大主题
360°把脉运营问题并贴合数据场景落地


本书主要基于Python实现,其中主要用到的计算库是numpy、pandas和sklearn,其他相关库还包括:
  • 标准库:re、time、datetime、json、 base64、os、sys、cPickle、tarfile
  • 统计分析:Statsmodels
  • 中文处理:结巴分词
  • 文本挖掘:Gensim
  • 爬虫和解析:requests、Beautiful Soup、xml
  • 图像处理:OpenCV和PIL
  • 数据读取:xlrd、pymongo、mysql.connector
  • 数据预处理:imblearn
  • 展示美化类:Matplotlib、graphviz、prettytable、wordcloud、mpl_toolkits、pydotplus
如果你对以下内容感兴趣,那么本书将值得一看:
  • KMeans聚类的自动K均值的确立方法
  • 基于软方法的多分类模型组合评估模型的应用
  • 基于自动下探(下钻、细分)的应用
  • 基于增量学习的多项式贝叶斯分类
  • pipeline管道技术的应用
  • 基于超参数的自动参数值的优化方法
  • 特征自动选择
  • 文本分类、文本主题挖掘
  • 基于自动时间序列ARIMA的P、D、Q的调整
  • python决策树规则输出
  • 基于自定义图像的文本标签云
  • 非结构化数据,例如图像、音频、文本等处理
  • 对象持久化处理
有关这本书的写作感受、详细内容介绍、附件(含数据和代码源文件-源代码可更改数据源直接使用)下载、关键知识和方法以及完整书稿目录,请访问《Python数据分析与数据化运营》新书上线,要购买此书请直接点击图片或扫描二维码去京东购买

发表评论

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

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>