学习笔记 | 独立成分分析(ICA, FastICA)及应用

article/2025/11/9 7:51:27

学习笔记 | 独立成分分析[ICA, FastICA]及应用

  • 1 背景说明
  • 2 算法原理
    • 2.1 ICA简介
    • 2.2 形式化表达
  • 3 算法步骤与代码
  • 4 算法改进:FastICA
  • 5 ICA实例与应用
  • 6 小结

概要: 这篇博客和博客学习笔记|主成分分析[PCA]及其若干应用属于一个系列,介绍独立成分分析(Independent Component Analysis, ICA)的原理及简单应用。ICA也是一种矩阵分解算法,尽管它最开始不是基于此而提出来的。
关键字: 矩阵分解; 独立成分分析; ICA

1 背景说明

   提到独立成分分析就不得不说著名的“鸡尾酒会问题”,如图1所示意。该问题描述的是一场鸡尾酒会中有N个人一起说话,同时有N个录音设备,问怎样根据这N个录音文件恢复出N个人的原始语音。鸡尾酒会问题也叫做盲源分离问题,ICA就是针对该问题所提出的一个算法。

图1 鸡尾酒会问题示意

 
   提到独立成分分析就不得不说著名的“鸡尾酒会问题”,如图1所示意。该问题描述的是一场鸡尾酒会中有N个人一起说话,同时有N个录音设备,问怎样根据这N个录音文件恢复出N个人的原始语音。鸡尾酒会问题也叫做盲源分离问题,ICA就是针对该问题所提出的一个算法。

2 算法原理

2.1 ICA简介

   ICA原理在此不再赘述,这里给出一些博主认为质量高的文章链接。

   这篇文章题为“说说鸡尾酒会问题(Cocktail Party Problem)和程序实现”,对ICA的原理作了简单描述,并且给出了一个实现代码;
   这篇文章是作者斯坦福CS229机器学习个人总结系列文章中的一篇,将ICA与因子分析(Factor Analysis, FA)、主成分分析(Principal Component Analysis, PCA)放在一起进行比较,图文并茂、内容详实,而且有一系列文章可供参考;
   这篇文章给出了ICA算法的可编程步骤,我的ICA代码就是参照这篇文章写的,同时作者也有一个关于CS229的学习心得系列值得一看;
   CSDN博主沈子恒的系列文章(意义、概念、直观解释、最优估计、信息极大化、与PCA的差别1、与PCA的差别2)由浅入深地从多个角度介绍了ICA及其改进算法,对ICA研究的多个方向均有涉及。

   除此以外,还有许多优秀的英文资料可供参考。

   这是吴恩达CS229课程中关于ICA算法的英文原版教案;
   这篇文章源于国外某个英文博主,从概率角度介绍了ICA算法并给出了一些实例;
   这里给出了ICA及FastICA算法的教材链接和一个MATLAB代码工具包。

   除此以外,还有各种教学网页和可视资源可以从YouTube、GitHub或其他网站上获取,这里不再罗列。

2.2 形式化表达

   将一个问题通过数学方法表达出来,就是形式化表达,这是求解问题的第一步。本篇同样用PPT代劳,如图2所示。

图2 ICA算法的形式化表示

 
   这就是ICA的形式化表示,对于一个输入的 n n n m m m列矩阵,ICA的目标就是找到一个 n n n n n n列混淆矩阵 A A A,使得变换后的矩阵仍为 n n n m m m列矩阵,但是每一行不再是多人说话的混合语音而是解混得到的某一个人的说话语音。

3 算法步骤与代码

   经过中间一系列计算步骤(这里不一一展现),最后得到了ICA算法的实现步骤如图3所示(仍然是PPT代劳):

图3 ICA算法执行步骤

 
   其中第3步提到的白化预处理步骤如图4所示,白化也是一个值得深入学习的概念,是数据处理中一个常用的重要方法,这里不细说。

图4 白化预处理步骤

 
   有了步骤,接下来就只剩小学生都会做的编程了。

   MATLAB代码如下:

function S = myICA(X)
%MYICM - The ICA(Independent Component Analysis) algorithm.
%   To seperate independent signals from a mixed matrix X, the unmixed
%   signals are saved as rows of matrix S.
%   Here are some useful reference material:
%   https://blog.csdn.net/YJJat1989/article/details/22593489
%   http://cnl.salk.edu/~tewon/Blind/blind_audio.html
%
%   S = myICA(X)
% 
%   Input - 
%   X: a N*M matrix with mixed signals containing M datas with N dimensions;
%   Output - 
%   S: a N*M matrix with unmixed signals.
% 
%   Copyright (c) 2018 CHEN Tianyang
%   more info contact: tychen@whu.edu.cn%% ICA calculation
if ~ismatrix(X)error('Error!');
end
[n,m] = size(X);
S = zeros(n,m);
W_old = rand(n);
for row = 1:nW_old(row,:) = W_old(row,:)/sum(W_old(row,:));
end
delta = 0.001;
itera = 1000;
alfa = 0.01;
for T = 1:mfor i = 1:iteraweight = zeros(n,1);for line = 1:nweight(line) = 1-2*sigmoid(W_old(line,:)*X(:,T));endW_new = W_old+alfa*( (weight(line)*(X(:,T))')+ inv(W_old') );if sum(sum(abs(W_new-W_old))) <= deltabreak;elseW_old = W_new;endendS(:,T) = W_new*X(:,T);
endend%% sigmoid function
%--------------------------------------------------------------------
function g = sigmoid(x)g = 1/(1+exp(-x));
end
%%

   白化步骤的代码也顺便一起贴上,注意白化一般也分为PCA白化和ZCA白化,按需输出结果。

function Y = myWhite(X,DIM)
%MYWHITE - The whitening function.
%   To calculate the white matex of input matrix X and 
%   the result after X being whitened. 
%   
%   Res = myWhite(X,DIM)
% 
%   Input - 
%   X: a N*M matrix containing M datas with N dimensions;
%   DIM: specifies a dimension DIM to arrange X.
%       DIM = 1: X(N*M)
%       DIM = 2: X(M*N)
%       DIM = otherwisw: error
%   Output - 
%   Y  : result matrix of X after being whitened;
%       Y.PCAW: PCA whiten result;
%       Y.ZCAW: ZCA whiten result.
% 
%   Copyright (c) 2018 CHEN Tianyang
%   more info contact: tychen@whu.edu.cn%% parameter test
if nargin < 2DIM = 1;
end
if DIM == 2X = X';
elseif DIM~=1 && DIM~=2error('Error! Parameter DIM should be either 1 or 2.');
end
[~,M] = size(X);%% whitening
% step1 PCA pre-processing
X = X - repmat(mean(X,2),1,M);        % de-mean
C = 1/M*X*(X');                       % calculate cov(X), or: C = cov((X)')
[eigrnvector,eigenvalue] = eig(C);    % calculate eigenvalue, eigrnvector
% TEST NOW: eigrnvector*(eigrnvector)' should be identity matrix.
% step2 PCA whitening
if all(diag(eigenvalue))    % no zero eigenvalueXpcaw = eigenvalue^(-1/2) * (eigrnvector)' * X;
elsevari = 1./sqrt(diag(eigenvalue)+1e-5);Xpcaw = diag(vari) * (eigrnvector)' * X;
end
% Xpczw = (eigenvalue+diag(ones(size(X,1),1)*(1e-5)))^(-1/2)*(eigrnvector)'*X;    % 数据正则化
% step3 ZCA whitening
Xzcaw = eigrnvector*Xpcaw;
% TEST NOW: cov((Xpczw)') and cov((Xzcaw)') should be identity matrix.%% result output
Y.PCAW = Xpcaw;
Y.ZCAW = Xzcaw;end

4 算法改进:FastICA

   事实上,ICA算法从提出至今就处于不断改进的进程中,到现在,经典的ICA算法已经基本不再使用,而是被一种名为FastICA的改进算法替代。顾名思义,该算法的优点在与Fast,即运算速度快。具体的改进点如图5所示。

图5 FastICA算法改进内容

 
   经实测,改进后的算法的确比之前的ICA算法快了很多,且效果更佳。FastICA算法代码如下:

function Z = FastICA(X)
%FASTICA - The FastICA(Fast Independent Component Analysis) algorithm.
%   To seperate independent signals from a mixed matrix X, the unmixed
%   signals are saved as rows of matrix Z.
%   Here are some useful reference material:
%   https://blog.csdn.net/zf_suan/article/details/53750455
%
%   Z = FastICA(X)
% 
%   Input - 
%   X: a N*M matrix with mixed signals containing M datas with N dimensions;
%   Output - 
%   Z: a N*M matrix with unmixed signals.%% 去均值
[M,T]=size(X);   %获取输入矩阵的行列数,行数为观测数据的数目,列数为采样点数
average=mean((X'))';  %均值
for i=1:MX(i,:)=X(i,:)-average(i)*ones(1,T);
end%% 白化/球化
Y = myWhite(X,1);
Z = Y.PCAW;
% Z=X;
%% 迭代
Maxcount=10000;  %最大迭代次数
Critical=0.00001;  %判断是否收敛
m=M;            %需要估计的分量的个数
W=rand(m);
for n=1:mWP=W(:,n);  %初始权矢量(任意)%Y=WP'*Z;%G=Y.^3;%G为非线性函数,可取y^3等%GG=3*Y.^2;   %G的导数count=0;LastWP=zeros(m,1);W(:,n)=W(:,n)/norm(W(:,n));         %单位化一列向量while (abs(WP-LastWP) & abs(WP+LastWP)) > Critical    %两个绝对值同时大于收敛条件count=count+1;  %迭代次数LastWP=WP;      %上次迭代的值%WP=1/T*Z*((LastWP'*Z).^3)'-3*LastWP;for i=1:m%更新WP(i)=mean( Z(i,:).*(tanh((LastWP)'*Z)) )-(mean(1-(tanh((LastWP))'*Z).^2)).*LastWP(i);endWPP=zeros(m,1);     %施密特正交化for j=1:n-1WPP=WPP+(WP'*W(:,j))*W(:,j);endWP=WP-WPP;WP=WP/(norm(WP));if count==Maxcountfprintf('未找到相应的信号');return;endendW(:,n)=WP;
end%% 数据输出
Z=W'*Z;end
%% 

5 ICA实例与应用

   ICA算法原本就是针对盲源分离问题而提出的,现在就将其应用于该问题,测试它的效果。由于语音信号无法上传至CSDN,因此把处理前后的文件上传网络并提供下载链接,文件说明如下。

图6 实验文件

 
   其中,“sound1.wav”和“sound2.wav”是2段清晰原始语音;“mixed1.wav”和“mixed2.wav”是2段由计算机上述两段语音混淆之后得到的语音;“icaunmixed1.wav”和“icaunmixed2.wav”是使用经典的ICA算法解混得到的结果;“ica_unmixed1_another.wav”和“ica_unmixed2_another.wav”是使用经典的ICA算法在另一组参数下得到的结果;“fastica_unmixed1”和“fastica_unmixed2.wav”是使用改进算法FastICA解混得到的结果。实验结果表明,FastICA耗时更短、效果更佳。

6 小结

   本文初步探讨了独立成分分析算法(ICA)的原理以及简单应用,本文只做了极简单、极表面的探讨而没有做更深一步的研究和其他尝试。如是否可用多于语音源的麦克风数量来提高解混效果、ICA参数选取的可解释性、除了FastICA外有无其他改进算法等。

   代码已上传至网络,欢迎下载,密码是1g02


http://chatgpt.dhexx.cn/article/hnoUAMcy.shtml

相关文章

ICA独立成分分析去除脑电伪影

今天分享的这篇利用独立成分分析ICA去除EEG伪影是翻译自jung大神的一篇文章。 目录 1 介绍 2 方法 3 实验数据样本 1 介绍 眼动&#xff0c;眨眼&#xff0c;肌肉&#xff0c;心脏和线的噪音会严重污染脑电图活动&#xff0c;这在脑电解释和分析中会产生非常严重问题。研究…

独立成分分析(ICA)

1.概念 独立成分分析是从多元(多维)统计数据中寻找潜在因子或成分的一种方法&#xff0e;ICA与其它的方法重要的区别在于&#xff0c;它寻找满足统计独立和非高斯的成分。这里我们简要介绍ICA的基本概念、应用和估计原理。 1.1 多元数据的线性表示 统计数据处理及相关领域中的一…

独立成分分析ICA系列2:概念、应用和估计原理.

1.概念 独立成分分析是从多元(多维)统计数据中寻找潜在因子或成分的一种方法&#xff0e;ICA与其它的方法重要的区别在于&#xff0c;它寻找满足统计独立和非高斯的成分。这里我们简要介绍ICA的基本概念、应用和估计原理。 1.1 多元数据的线性表示 统计数据处理及相关领域中的一…

详解独立成分分析

最近在学习数据降维的一些方法(有关数据降维的其他内容请看这篇文章)&#xff0c;虽然独立成分分析不算是严格意义上的降维方法&#xff0c;但是它和PCA有着千丝万缕的联系&#xff0c;所以打算专门写一篇文章来学习ICA的相关知识&#xff0c;看了挺多的关于ICA的博文&#xff…

独立成分分析

在已知语音信号方向的情况下&#xff0c;波束形成能明显改善语音质量&#xff0c;提高信噪比&#xff1b;然而在实际环境中&#xff0c;人可能是走动的&#xff0c;即使坐立不动&#xff0c;由于身体的扭曲使得语音到达阵列的方向也是变化的&#xff0c;此时波束形成效果受到限…

独立成分分析(Independent Component Analysis,ICA)原理及代码实现

过程监控中会用到很多中方法&#xff0c;如主成分分析&#xff08;PCA&#xff09;、慢特征分析&#xff08;SFA&#xff09;、概率MVA方法或独立成分分析&#xff08;ICA&#xff09;等为主流算法。 其中PCA主要多用于降维及特征提取&#xff0c;且只对正太分布&#xff08;高…

清理vdbench后台进程

当我们打开一个终端&#xff0c;用nohup运行vdbench程序。断开连接后&#xff0c;你发现你写的配置文件有误&#xff0c;想关闭已有的vdbench进程。你重新连接上终端&#xff0c;咦&#xff0c;我的jobs命令怎么没有显示我的nohup任务呢&#xff1f;这是因为你的nohup任务的sh进…

Nas性能测试工具-vdbench

版本&#xff1a; vdbench50406 简介&#xff1a; vdbench是一个 I/O 工作负载生成器&#xff0c;用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具&#xff0c;容易使用&#xff0c;而且常常用于测试和基准测试。 配置参数&#xff1a; 大文…

Linux中vdbench的安装与使用

vdbench是一个 I/O 工作负载生成器&#xff0c;用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具&#xff0c;容易使用&#xff0c;而且常常用于测试和基准测试。 可以使用vdbench测试磁盘和文件系统的读写性能。 环境&#xff1a;Ubuntu 16.04 …

vdbench和fio测试磁盘性能的对比总结

vdbench和fio测试磁盘性能的对比总结 一、安装 1、安装vdbench&#xff0c;首先安装java&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 其次下载vdbench安装包并进行安装&#xff1a;http://pan.baidu.com/s/1b7XooY&am…

vdbench使用

简介 vdbench是一个 I/O 工作负载生成器&#xff0c;用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具&#xff0c;容易使用&#xff0c;而且常常用于测试和基准测试。 可以使用vdbench测试磁盘和文件系统的读写性能。 名词解释 vdbench中常用的…

vdbench测试SSD快速入门

介绍 vdbench是一个I/O工作负载生成器&#xff0c;通常用于验证数据完整性和度量直接附加&#xff08;或网络连接&#xff09;存储性能。它可以运行在windows、linux环境&#xff0c;可用于测试文件系统或块设备基准性能。我们下面主要以块设备为介绍对象。 下载及安装 下载…

vdbench多主机运行指导

测试工具之vdbench多主机运行 本文介绍vdbench在多机环境下的操作和配置,以及本人在配置过程中遇到的问题和解决方法。 文章目录 测试工具之vdbench多主机运行前言一、vdbench在linux环境下多机运行1.环境参数2.配置说明二、vdbench在windows环境下多机运行1.环境参数2.配置…

Vdbench工具安装使用

一、 概述 1.1 内容简介 Vdbench 是一个命令行使用程序&#xff0c;旨在帮助工程师和客户生成用于验证存储性能和存储数据完 整性的磁盘 I/O 负载。还可通过输入文本文件指定 Vdbench 执行参数。它是一个免费的工具&#xff0c;容 易使用&#xff0c;而且常常用于测试和基准测试…

Vdbench工具的安装及使用

Vdbench工具的安装 Vdbench的运行依赖java环境&#xff0c;请务必先安装java运行环境安装java&#xff0c;Ubuntu OS环境安装java: apt-get install openjdk-8-jdkCentos OS环境安装: yum install openjdk-8-jdk检查是否安装成功 安装vdbench,下载vdbench50407.zip包&#…

Java jre的安装与卸载

文章目录 1. jre安装2. 卸载 Java JDK安装教程 Idea Java开发环境配置教程&#xff1a; https://tangxing.blog.csdn.net/article/details/112392218 1. jre安装 java下载网址&#xff1a; https://www.java.com/zh-CN/download/manual.jsp 这里有联机版和脱机版&#xff0c;…

彻底卸载jdk,jdk安装 ,javaa安装,jdk删除干净

标签&#xff1a; 一.备份安装好的绿色版JDK a.重新安装JDK到任意目录&#xff0c;假设这个目录是C:\java。 b.将装好的JDK,JRE拷贝到任意一个其他目录&#xff0c;如D:\bak,这样做的目的主要是为了备份JDK。(建议打成zip压缩包奔备用)二.彻底卸载JDK1.第一步,首先卸载或删除J…

Java如何卸载?怎么删掉Windows计算机上的Java?Java卸载流程详解!

大家都知道Java版本不是一成不变的&#xff0c;Java会朝着功能增加、漏洞修复和性能优化的方向一直进步。而公布新版Java之后&#xff0c;我们需要使用它&#xff0c;那么卸载掉旧版的Java很有必要&#xff0c;为什么呢? 这是Java官方给出的回复&#xff1a; 我们强烈建议您…

JAVA安装、配置及卸载

基本上从入门到实用非常全面了。 安装 安装Eclipse先配置jdk jdk下载地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/index.html &#xff08;此处以jdk8为示例&#xff09; 一、安装jdk 此处默认路径即可&#xff0c;单击下一步 安装完成后会…

Java类的卸载机制

类的生命周期 当Sample类被加载、连接和初始化后&#xff0c;它的生命周期就开始了。 当代表Sample类的Class对象不再被引用&#xff0c;即不可触及时&#xff0c;Class对象就会结束生命周期&#xff0c;Sample类在方法区内的数据也会被卸载&#xff0c;从而结束Sample类的生命…