这个包包含实现主成分分析(PCA)和独立成分分析(ICA)的函数。
PCA和ICA在此包中作为函数实现,并包含多个示例来演示它们的使用。
在PCA中,多维数据被投影到其最大的几个奇异值对应的奇异向量上。这样的操作有效地将输入单向量在数据中方差最大的方向上分解成正交分量。因此,PCA经常用于降维应用程序,在这些应用程序中,执行PCA会产生数据的低维表示,可以反向重建原始数据。
在ICA中,多维数据被分解成在适当意义上最大程度独立的组件(在这个包中是峰度和负熵)。ICA与PCA的不同之处在于,低维信号不一定对应最大方差的方向;相反,ICA成分具有最大的统计独立性。在实践中,ICA通常可以发现多维数据中不相交的潜在趋势。
布莱恩·摩尔(2021)。PCA和ICA软件包(//www.tatmou.com/matlabcentral/fileexchange/38300-pca-and-ica-package), MATLAB中央文件交换。检索.
嗨,谁能帮我完成我的脚本关于提取信号的特征(频率)通过使用神经网络,现在我想使用独立成分分析(ICA)。紧急的
谢谢,找到了
我需要一个关于产妇心电信号取消的想法,请帮忙
嗨,布莱恩,谢谢你的精彩剧本。我有一个问题。
在重建Zr时,我如何选择要使用的组件数量?
(例如,在绘制ic后,我想从原始信号中删除第二和第三个分量)。
谢谢。
嗨布莱恩
感谢您与我们分享您的代码。我试图应用PCA来漂白m×n矩阵Z, Z的行表示时间序列,列与空间相关。在你的代码中,你计算白化的Z为Zw = U * S^-0.5 * U' * Z,其中U和S是特征向量和特征值。或者,我们也可以得到白化的Zw_ = S^-0.5 * U' * Z,有什么区别?
此外,如果我们想用几个特征向量和特征值来白化Z,这可以从PCA中得到,如何实现?我尝试使用以下代码,但结果是错误的:Zw=U(:,1:r) * S(1:r,1:r)^-0.5 * U(:,1:r)' * Z,其中1到r是选择的特征向量和特征值的顺序。最后一个警告是“T \ W”接近奇点。
期待您的回复,谢谢!
你好,再一次
我在这里找到了:A. Hyvärinen和E. Oja。独立分量分析的快速不动点算法。神经网络计算,9(7):1483-1492,1997。
在第5页,方程9,这个方程是这里给出的。方程的开头有一个标量乘法,这是我最好奇的。下一句说:“因此eq(9)中的标量不显著,其作用可以用显式归一化或w在单位球上的投影来代替。”
问题到此结束
你好
虽然我已经多次阅读被引用的论文,特别是第4.2章和4.2.1章,没有任何像你提出的方程(是的,有主要方程),但我不明白你是如何计算峰度和其他测量的,如下所示:
``
如果USE_KURTOSIS
%峰度
G = 4 * Sk ^3;
Gp = 12 * Sk.^2;
其他的
%负熵
G = Sk. * exp(-0.5 * Sk.^2);
Gp = (1 - Sk.^2) * exp(-0.5 * Sk.^2);
结束
W = (G * Zcw') / n - bsxfun(@times,mean(Gp,2),W);
``
你能解释一下你是如何决定使用G, Gp的系数的吗?它们是用来做什么的?
接下来,为什么要减去它们来计算矩阵W?论文的哪一部分提到了这些计算?
如果你能让它们更清晰就太好了。
谢谢。
谢谢大家! !
嗨布莱恩
感谢分享你的代码
我的问题是
我想对EEG信号使用ICA来去除任何其他伪影,我的数据矩阵(m x n)包含的通道为
列及其作为行的输出
首先,我们是否可以认为通道的数量是d维数据的(n)个样本,你在帮助部分提到的d我们可以认为它是通道的输出数据?
第二,r是要计算的独立分量的个数,它可以是任意的数吗?
我试图使用它,因为我上面提到我和我的结果矩阵包含非常小的值,如(0.00221,0.0171)是对还是错?
惠布莱恩。我可以知道如何将此应用于OFDM以降低PAPR吗?
你好布莱恩,
优秀的包装!
我发现了一个小bug。在demo_ICA中,当添加噪声时,代码:
σ= @(信噪比,X) exp(信噪比/ 20)*(规范(X(:)) /√(元素个数(X)));
应该改为sigma = @(SNR,X) 10^(-SNR / 20) * (norm(X(:)) / sqrt(nummel (X)));
如果信噪比以dB为单位。
您可以通过MATLAB的snr函数检查结果:
信噪比= 50;
σ= @(信噪比,X) 10 ^(信噪比/ 20)*(规范(X(:)) /√(元素个数(X)));
Znoisy = Ztrue + sigma(SNR,Ztrue) * randn(size(Ztrue));
信噪比(Ztrue Znoisy-Ztrue),
——产量约为50
但原始的“sigma = @(SNR,X) exp(-SNR / 20) * (norm(X(:)) / sqrt(nummel (X)));”将给出大约20的输出。
亲爱的布莱恩·摩尔:
谢谢你的包裹。
我有一个问题,是否可以使用您的软件包进行盲图像分离(ICA)?其中我的数据是混合图像,我想从中恢复原始图像,如果是,请提供一些信息给我。
非常感谢
W的左奇异向量和W * W'的特征向量是一样的,所以这两个是等价的。
@Jason。好赶上!我不知道为什么我使用permute(),而一个简单的外部产品就可以完成这项工作。我已经更新了代码,以使用你更好的实现。
为什么使用[U, S, ~] = svd(R,'econ');在fastICA白行??
因为我们要做的是特征值分解而不是奇异值分解https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf.有人能解释一下吗?
你好,
首先,感谢代码。我尝试了一下,因为我正在寻找比FastICA2.5软件包更少GUI的东西。当运行这个版本时,它非常慢。罪魁祸首似乎是使用保湿剂。也许我处理得对,也许不对。改变台词
Sk = permute(W * Zcw,[1,3,2]);Sk = W * Zcw;
和
W =意味着(bsxfun (@times, G,排列(Zcw[3 1 2])), 3) -…
bsxfun (@times,意味着(Gp, 3), W);
来
W = n。\ (G * Zcw”)——bsxfun (@times,意味着(G, 2), W);
其中n是Zcw的第2维它的>速度是Zcw的100倍。
K>> Sk = permute(W * Zcw,[1,3,2]);
K>> G = 4 * Sk.^3;
K>> Gp = 12 * Sk.^2;
K > >抽搐
K > > W =意味着(bsxfun (@times G,排列(Zcw[3 1 2])), 3) -…
bsxfun (@times,意味着(Gp, 3), W);
K > > toc
运行时间为191.121200秒。
K > > Sk = W * Zcw;
K>> G = 4 * Sk.^3;
K>> Gp = 12 * Sk.^2;
K > >抽搐
K > > W2 = n。\ (G * Zcw”)——bsxfun (@times,意味着(G, 2), W);
K > > toc
运行时间为0.377219秒。
对于玩具问题,答案是一样的。对于像上面这样的大问题,它当然不是,但非常相关。
先生,我如何在图像上应用ICA
嗨,布莱恩!
我是Matlab和信号处理的新手。我想把肠胃噪音和数字听诊器录下的心音分开,我可以用这个算法吗?
d=1的情况不是很有趣,因为你必须选择r <= d
亲爱的布莱恩,谢谢你的工具箱。
如果数据d=1, r未知,我还能用这个方法吗?
谢谢你!
很抱歉耽搁了。希望你看到我之前在这里回答了一个类似的问题。
ICA具有固有的缩放和旋转模糊性,因此必须对输入数据进行白化(不相关,单位方差)以获得唯一解。因此,输出组件没有任何固有的顺序。
然而,根据“帮助fastICA”,如果你这样做:
[Zica, A, T] = fastICA(Z,r);
W = T \ pinv(A);
那么W是一个矩阵,使得(直到一个常数偏移量)
Z≈W * Zica
因此,您可以将norm(W(:,k))^2解释为第k个独立分量的“幂”,因为当norm(W(:,k))^2很大时,Zica(k,:)对z有很大的贡献。您可以使用此来为组件分配排序。
我对这个话题做了一个快速搜索,发现下面的论文提出了一个类似的过程:
http://doc.utwente.nl/64279/1/27_17_hendrikse.pdf
注意,一般来说,如果您对r < d组件感兴趣,我建议您直接尝试较小的r值,而不是计算r = d组件,然后尝试选择组件。一般来说,人们期望高维数据由几个“信号”或“信息”成分以及许多“噪声”或“滋扰”成分来描述。在ICA中,输出分量是相互正交的,所以最好直接计算r < d分量(我们希望它是有信息量的),而不是计算太多的分量(一些“更”嘈杂的),当施加正交性时,它们以复杂的方式相互作用。
希望这对你有所帮助。
@jyoti:很抱歉耽搁了。R < d组件绝对是可能的(实际上,建议这样做)。我对你的问题的解释是,你正在计算r < d组件用于压缩,然后你想重建你的信号。你不能完全重建,但是,根据“帮助kICA”,如果你运行:
[Zica, W, T, mu] = kICA(Z,r);
然后
Zr = T \ W' * Zica + repmat(mu,1,n)
是输入数据Z的r维近似。
你好
感谢您与我们分享您的代码。我正试图将ICA应用于由90个预测因子组成的时间序列数据集。在获得独立分量(我选择了90个分量)之后,目标是将它们用作线性回归中的预测因子。
我想知道您的代码的独立组件输出是否以某种方式排序,因此我可以使用CV或ic来选择最佳模型(少于90 ic)。或者,有没有推荐的方法来排序独立的组件?
谢谢你的帮助
你好布莱恩,因为当我实现(r
我很欣赏你的解释性回复。
我只是想知道是否存在r
提前感谢。
@Federica:我不熟悉你的特定应用程序,但如果你看一下代码,你会看到,如果你运行
[Zica, W, T] = fastICA(Z,…);
然后你得到
Zica = W * T * (Z - meanZ)
其中均值z减去z的逐行均值。这里,W是ICA权重矩阵(我称之为“混合矩阵”),T是预白化变换。所以我会说你对W的列或者W * t的列都感兴趣,也许两个都试试,看看哪个更适合你?
@Brian。请原谅我问你一些问题。我试图找出土木工程中使用ICA的模态振型,我已经读到它们包含在混合矩阵的列中。因此,如果我正确地阅读了前面的注释,W是由代码计算的估计混合矩阵。我理解对了吗?我问你这个问题是因为我正在用ICA做一些练习,我运行过demoICA。M包含在包装中。我注意到混合矩阵A(用于混合信号Znoisy)不同于应用fasticam估计的W矩阵。我应该用T\W'来定义矩阵吗?
请原谅我的问题,我希望我已经充分解释了我的问题。
@anurag。输入“help fastICA”查看如何使用ICA实现。基本上你只要打电话:
Zica = fastICA(Z,r);
其中Z是矩阵,它的第i行包含第i块肌肉的肌电信号,r是你想要计算的独立分量的数量。
亲爱的布莱恩
感谢分享你的代码。
我是Matlab的新手。
我想把ICA应用到不同肌肉的肌电信号上。
我有xl文件中的所有信号。我会在matlab中调用它。
之后我就被困在你的代码里了。你能帮帮我吗?
@ shane:请记住,corcoef (x,y) = - corcoef (x,-y),所以符号可能在主成分上翻转(即,eigVecs(:,1)的条目可能是负的)。主成分只有在按比例递增时才是唯一的。我对你的结果的解读是灰质和血流在大脑区域之间有很强的负相关。
你好布莱恩,
再次感谢你的解释。我正在慢慢掌握它的窍门。
[r_Zpca_GreyMatter p_BloodFlow] = corcoef (Zpca_GreyMatter,Zpca_BloodFlow)的相关性为r=0.6, p<0.0001。
当我在Zpca_GreyMatter值和原始灰质体积(在受试者中平均)之间进行相关性时,我得到了r = -0.9的相关性。所以我仍然在努力解释Zpca值的含义。
我是否可以推断,Zpca_GreyMatter和Zpca_BloodFlow之间的强正相关意味着整个大脑的“空间模式”是相似的?非常感谢。
@ shane:是的,mu是一个dx1向量,包含输入数据行之间的平均值,所以在你的情况下,每个病人的平均灰质/血流量。听起来灰质和血流是负相关的。
通过使用数据的第一个主成分,您可以捕获所有患者数据的主导趋势(从某种意义上说,它描述了数据中最大的方差)。您可以将其视为对数据行进行平均的“更智能”的替代方法
Zavg_GreyMatter = mean(GreyMatter,1);
Zavg_BloodFlow = mean(BloodFlow,1);
因为第一个主成分会接近这些平均值如果它们是有意义的如果平均值不那么有意义的话
还有一个问题,我注意到mu代表每个主题的变量中平均灰质体积。这是正确的吗?此外,在绘制Zpca_GreyMatter和Zpca_BloodFlow之间的关系后,看起来血流量很少的区域都具有最高(最积极)的Zpca_BloodFlow分数。我正在努力解释这里的Z,谢谢!
哇,没想到会有这么深入的回应。谢谢你,布莱恩!
提供更多细节…
是的,我的数据被安排在25(患者)x 100(大脑区域),我想解决的问题是,灰质体积的主要模式是否与血流密切相关。关键词是优势格局/地形。因此,我只关注第一个PCA的相关性。
运行eigvec之间的相关性也产生了高度显著的相关性。
如果这与你的话题无关,我很抱歉,但我能得到你的想法吗?这种方法与简单地在100个区域中对灰质体积和血流量进行Pearson相关性分析有何不同?
祝你一天愉快!
谢谢你的快速回复,所以你的意思是这个代码是基于基于峰度的近似G(x) = y^4。
还有一个问题,这个FastICA代码是如何实现去相关的?你是在使用基于类似克拉姆-施密特解相关的通缩方案吗?还是其他人?
@Wooyoung:你可以在峰度(默认)和负熵之间选择非高斯度量
你好,大脑,
谢谢你分享这个很棒的代码!
不过有一个问题。你在FastICA算法中使用了哪个非二次函数?
这是一个非常合理的实验。您以25x100或100x25矩阵的形式传递数据吗?
如果是25x100,你已经证明了灰质体积和*脑区域*的血流量之间有很强的相关性(我假设是正相关性),也就是说,如果一个给定的脑区域有很大的灰质体积,那么它可能有更多的血流量。在这里,进行PCA(…,1)是对患者进行“平均”,以找到主导趋势。
如果是100x25,你已经表明,在*患者*中,灰质体积和血流量之间存在很强的相关性(再次假设为正),也就是说,如果患者的灰质总量较大,他们也可能有更多的血流量。在这里,进行PCA(…,1)是对大脑区域进行“平均”,以找到主导趋势。
存在负值是因为PCA的第一步是减去数据的平均值(“mu”向量)。所以负值意味着“低于平均水平”。
你好布莱恩,
谢谢你发布这个。
我有25个主题和100个变量(大脑区域)的2个数据集。数据集A =灰质体积。数据集B =血流。
Zpca_DataA, U, mu, eigVecs] = PCA(DataA,1);
zpca_data, U, mu, eigVecs] = PCA(data,1);
[r p] = corcoef (Zpca_DataA,Zpca_DataB)。
这看起来对吗?
这非常重要。这是否意味着数据集A和B中的主要成分在大脑区域之间是相关的?负值在Zpca_DataA中意味着什么?非常感谢你的帮助!!
非常感谢!
@Md:欢迎您探索我的其他文件交换包
再次感谢……你们是否有修改独立成分分析的软件包,其中ic保留PCA的排名?或者其他的统计软件包比如受限玻尔兹曼机或者支持向量机?金宝app你的代码是健壮的。
@Md: fastICA函数会在内部漂白输入数据,所以您不必自己做。当你打来电话
[Zica, W, T, mu] = fastICA(Z,r);
得到W =混合矩阵和T =白化变换
你好布莱恩,
我有一些问题。
1.在插入之前,我是否应该将数据预处理为零平均值和单位标准偏差?
2.什么是分离/脱混矩阵?
谢谢。
@Md:根据“帮助fastICA”,你把你的数据传递到我的实现中
Zica = fastICA(Z,r);
其中Z是一个d × n矩阵,有d = #个变量和n = #个样本。输出Zica是一个rxn矩阵,包含每个样本的r个自变量。
我对您的特定应用程序没有经验,但我认为您需要(a)确定要放入Z的正确“变量”,以及(b)决定如何从Zica检测故障。
你好,我想用ICA进行流程故障检测。我有22个变量。我需要将I2和SPE统计数据与ICA结合起来。你能帮忙吗?
谢谢Brian的解释。
@Ahmed:请阅读文档和代码,看看你到底需要什么,但是打电话
[Zica, W, T, mu] = fastICA(Z,r);
返回数据Z的独立组件Zica,以便
Zica = W * T * (Z - repmat(mu,1,d))
式中,W =混合矩阵,T =预白化变换,mu =数据均值
你好Brian,我需要找到我的ICA问题的混合矩阵A,其中X=AS和Y=WX=WAS- >S。
如何使用这个程序找到混合矩阵?
谢谢
谢谢你,布莱恩,你的回答又快又好
ICA有很多变体。即使是“快速ICA”也指的是一系列有多种选择的算法(非高斯度量、预处理等),因此不同的代码可能产生不同的结果。唯一知道的方法是研究代码的文档并查阅文献中的相关论文,例如:
http://mlsp.cs.cmu.edu/courses/fall2012/lectures/ICA_Hyvarinen.pdf
你好,布莱恩。
首先,我迟到了,谢谢你的包裹。
第二,我需要你的算法的帮助。我尝试了两种ICA算法,你的和一个来自那里(https://research.ics.aalto.fi/ica/fastica/),只是为了比较和理解ICA。
问题是,这两种算法得到的结果是不一样的。我希望我能成功地解释清楚。
谢谢你!
@Huang:是的,它只提供混合音频。运行demo_ICA。M脚本查看此示例。
这个功能可以只给混合音频工作吗?因为在现实世界中,我们不可能总是得到“真实”的音频。
@Binh: demo_ICA前半部分的变量Znoisy。M代码的命名很糟糕——在演示中根本没有“噪音”;估计的分量仍然有相同的“噪声”。
标准的快速ICA算法不能单独处理噪声,需要对其进行改进。我自己还没有实现这些变化,但请访问下面的网页,看看ICA专家是如何做到的:
http://research.ics.aalto.fi/ica/noisyica/
亲爱的,
在代码中,您在混合独立源之前添加了噪声。
我试着在混合后添加噪音,代码不能很好地工作。
对于这个问题你有什么建议吗?
谢谢你!
这意味着这个公式(Zr = T \ W' * Zica + repmat(mu,1,n))可以用来精确地重建信号?而pinv(W)是求逆函数??
@afira: W是r x d。当r == d时,你只能准确地“解混”信号,在这种情况下W是平方的(可逆的)。当r < d时,你不能完全“解混”信号,但你能做的最好的是使用pinv(W)。注意W是一个特殊的矩阵——它有标准正交行——所以pinv(W) = W'。这就是我写信的原因
Zr = T \ W' * Zica + repmat(mu,1,n)
而不是等效公式
Zr = inv(T) * pinv(W) * Zica + repmat(mu,1,n)
@brian我们需要自己求W的逆吗?如果是,那么请引导,因为W矩阵不是方阵。
谢谢你,先生。@brian
@afira:抱歉,我在最近的更新中将myICA重命名为fastICA。请阅读fastICA的文档以了解输出。例如,文档告诉我们
[Zica, W, T, mu] = fastICA(Z,r);
Zr = T \ W' * Zica + repmat(mu,1,n)
是输入数据的r维ICA近似。
@brian,我们如何从提取的独立分量中重建原始信号?
@brian还有一个问题。在你之前的评论中,你说混合矩阵是'A' ?我找不到ica的帮助。没有名为myICA的函数,而是有fastICA函数,两者都是一样的??
@Afira:混合矩阵是W,所以“不混合”矩阵是W^(-1)。fastICA代码返回
Zica = W * Zcw
其中Zica为ICA分量,W为混合矩阵,Zcw为输入数据的居中白化版本
你好布莱恩,
你能告诉我你用了哪些变量来混合和分解矩阵吗
很抱歉耽搁了。希望你看到我回答了下面几个问题的本质上相同的问题。我在这里重复一下我的回答:
ICA具有固有的缩放和旋转模糊性,因此必须对输入数据进行白化(不相关,单位方差)以获得唯一解。
然而,根据“帮助我的ica”,如果你这样做:
[Zica, A, T] = myICA(Z,r);
W = T \ pinv(A);
那么W是一个矩阵,使得(直到一个常数偏移量)
Z≈W * Zica
因此,您可以将norm(W(:,k))^2解释为第k个独立分量的“幂”,因为当norm(W(:,k))^2很大时,Zica(k,:)对Z的贡献很大。
我对这个话题做了一个快速搜索,发现下面的论文提出了一个类似的过程:
http://doc.utwente.nl/64279/1/27_17_hendrikse.pdf
希望这能帮到你,
布莱恩
@Jeffrey:谢谢你的提示!修复在2.1
@Binh: permute()调用在那里,所以我可以执行所有必要的计算,而不需要任何for循环。
在代码中,有三个相关的维度:r, d,和n。有些数组是d × n,有些是r × n,有时我需要通过计算n个矩阵的平均值来计算r × d数组,这些矩阵本身是r × 1和d × 1向量的外积。下载188bet金宝搏
例如,假设X是r X n, Y是d X n,那么我想要的r X d矩阵(比如Z)可以计算为
Xp = permute(X, [1,3,2]);% r x 1 x n
Yp = permute(Y, [3,1,2]);% 1 x d x n
Z = mean(bsxfun(@times, Xp, Yp), 3);% r x d
希望这对你有帮助!
@mas saud:这听起来像是路径问题。确保您放置kICA的目录。m在你的MATLAB路径上。或者当您试图调用该函数时,您在该目录中
亲爱的布莱恩先生:
我可以问一下,在第99行和111行做“排列”的目的是什么?
谢谢你!
效果很好,但您可能需要考虑用audioread()代替wavread()函数调用。Wavread从R15b开始被删除…在此之后的任何版本都可能导致错误
我正在尝试使用ICA图像,我首先将图像分解为2D并使用
[Zica, W, T, mu] = kICA(g,3);
未定义函数'kICA'用于类型'int8'的输入参数。
未定义函数'kICA'用于'double'类型的输入参数。
任何帮助都是感激的
@ Brian Moore。亲爱的先生,谢谢您的软件。太好了!
我测试过了,但我不知道如何用它来分析谐波。
非常感谢!
@ Brian Moore。亲爱的摩尔先生,非常感谢您的软件。关于输出,我有几个问题。有办法恢复信号的原始比例吗?我的意思是在算法过程中,数据被居中和白化。主成分的均值为0,标准差为1,没有办法恢复它们的原始值?第二个问题涉及与每个主成分相关的方差。有没有一种方法可以像PCA算法那样计算它?谢谢你的关注。大卫
@ Brian Moore
先生,我正在研究一个项目,该项目需要使用视频图像的ICA分离RGB通道。作为一个新人在这个编码饲料我需要你的帮助,为我提供一个合适的代码,可以为我们的项目工作。得到它会有很大的好处。
先生,我正在研究一个项目,该项目需要使用视频图像的ICA分离RGB通道。作为一个新人在这个编码饲料我需要你的帮助,为我提供一个合适的代码,可以为我们的项目工作。得到它会有很大的好处。
@Brian。请忽略我之前的信息。我在看2015年的代码版本。2017年版本确实有Gp = (1 -u^2) exp(-u^2/2)。谢谢你的帮助。
@Brian:非常感谢你的澄清。我错了,我把g解释成g而不是g的导数,这就引出了另一个问题
在您的代码中,Gp=Sk*G。这不是(u²)exp(-u²/2)而不是(1 -u²)exp(-u²/2)吗?
@Asad:谢谢你对我的代码感兴趣。我相信这是正确的。你是正确的,我的代码中的变量G包含论文中的G (w^Tx),变量Gp包含G '(w^Tx)。在我的代码中使用大写字母(选择是因为变量是矩阵)可能会令人困惑,因为论文中还有一个函数G(.),它是G的不定积分。Hyvarinen论文建议设置
G(u) = -exp(-u^2/2)
作为负熵的鲁棒近似,因此FastICA算法中使用的实际数量将是
g(u) = g '(u) = u exp(-u^2/2)
g'(u) = g'(y) = (1 -u²)exp(-u²/2)
不确定为什么使用g(u) = -exp(-u^2/2)更适合您的数据—g()的选择是一个启发式的选择,因此在实践中性能可能会有所不同。希望这对你有所帮助
你好布莱恩,
非常感谢分享这个代码。它非常有用。我有一个问题:
对于负熵的估计,使用G = Sk. * exp(-0.5 * Sk.^2)。根据我目前对Hyvarinen & Oja(2000)的理解,如果G指的是论文(423页)中的G (w'x),我认为应该是G =-exp(-0.5 * Sk.^2)。对于我使用的测试数据,我实际上也得到了更好的结果。你能解释一下G是否指G (w'x),如果是,为什么要这样计算?
多谢。
先生,
我如何使用这个fastica算法来分离eeg信号
先生,
我正在考虑使用这个代码肌电图日期提取肌肉协同作用。我是否必须把数据输入到你的代码中,得到一个W矩阵,这将是肌肉的协同作用。
@Brian摩尔
我需要找到脑电图小波分量的ica。如何这个代码可以适用于我的信号..响应是非常赞赏......
谢谢!
嗨,这个代码需要多个程序同时播放吗?我可以知道哪个是给哪个的吗?如何在MATLAB中编写多个程序?
这个代码可以应用到4D数据吗,比如fMRI?谢谢
@Pär:感谢您对我的代码感兴趣!ICA具有固有的缩放和旋转模糊性,因此必须对输入数据进行白化(不相关,单位方差)以获得唯一解。
然而,根据“帮助我的ica”,如果你这样做:
[Zica, A, T] = myICA(Z,r);
W = T \ pinv(A);
那么W是一个矩阵,使得(直到一个常数偏移量)
Z≈W * Zica
因此,您可以将norm(W(:,k))^2解释为第k个独立分量的“幂”,因为当norm(W(:,k))^2很大时,Zica(k,:)对Z的贡献很大。
我对这个话题做了一个快速搜索,发现下面的论文提出了一个类似的过程:
http://doc.utwente.nl/64279/1/27_17_hendrikse.pdf
希望这能帮到你,
布莱恩
谢谢Brian分享你的作品!!我的测试数据非常好!只有一个问题;每个分量的振幅被缩放到方差=1,但是是否有可能估计分量之间的相对振幅或绝对振幅?
谢谢你出色的工作。
@Brian:我读了论文,理解了基本概念。我正在应用你的代码来系统地测试非高斯随机变量上的ICA。我想你可能知道一些限制条件。我混合了均匀随机变量,指数随机变量,瑞利随机变量和对数正态随机变量。现在我在这上面多花了一点时间。Lognormal看起来并不比其他任何东西更麻烦。它似乎取决于分布的参数,这些参数可以调整它们与高斯分布的相似性。就像你写的,这可能就是问题所在。
@Jason:我的代码实现了FastICA算法从(链接下面)与高斯负熵。换句话说,它产生的输出组件尽可能“远离高斯”。正如你可能知道的,这种目标的选择是由中心极限定理证明的——你混合在一起的独立信号越多,结果就越像高斯——所以分解成非高斯分量是一种合理的方法来扭转混合。
从这个直觉来看,我认为FastICA是失败的,因为对数正态分布太“像高斯”了。
听起来你只是在做实验,但如果你真的对恢复类高斯信号感兴趣,也许Hyvarinen的论文或其中的一些参考文献会提出修改来解决这个问题。
http://mlsp.cs.cmu.edu/courses/fall2012/lectures/ICA_Hyvarinen.pdf
我编写了一个脚本来生成两个统计独立的组件,并将它们混合以合成一个双通道信号。我最近用你的myICA代码合成了信号。在大多数情况下,myICA计算的组件与用于合成信号的组件相匹配,但并非所有情况都是如此。例如,当我对两个分量使用对数正态分布和均匀分布时,它失败了。对于大多数其他情况,它工作得很好。您能对代码的限制进行注释吗?
@Long B:看起来你在做和之前的评论员JANANI a一样的事情,那就是:
听起来像是传入了一个1 x n的标量信号。ICA不是这样工作的。你必须传入一个d × n的信号矩阵(复数),然后ICA将它们分离成r <= d个分量
你好布莱恩,
这是我第一次在Matlab中使用ICA。我使用Zica= myICA函数来分解矩阵,这是来自混合物的信号。但结果是,所有分解后的矩阵,都是一样的。我想知道我的手术是否出了问题。我期待你的回复。提前感谢。
谢谢你的回复,先生。
@JANANI A:听起来你在传递一个1 x n标量信号。ICA不是这样工作的。你必须传入一个d × n的信号矩阵(复数),然后ICA将它们分离成r <= d个分量
先生,
非常感谢您的回复。
我试图使用ICA分析我的信号,并希望分离信号中存在的独立源。根据算法,输入参数为Z和r,其中r为期望的独立分量数。如果我给'r'的值大于1,我就会得到所有ic的相同值!假设r=3,输出矩阵由三行组成,ic,我发现第二和第三行值与第一行相同!你能告诉我哪里做错了吗?
提前感谢!
@JANANI A:输入“帮助myICA”并阅读“输出”部分,看看如何(大约,当r < d时)重建输入信号
亲爱的布莱恩,
非常感谢你的包裹。
我有一个关于原始信号重建的问题。我们得到的输出是独立分量。我们如何从获得的ic中重建信号?
在这方面的任何帮助都将非常感谢。
谢谢你!
@Mohammed:我现在看到了混乱:你认为F和D分别是样本协方差W * W'的特征向量和特征值。对我来说,U和S分别是原始权重w的左奇异向量和奇异值。这两种方法是完全等价的——样本协方差的特征值是原始权重的*平方*奇异值,所以在我的公式中不需要平方根。
这是证明:
%随机权重
W = randn(30,70);
方法一
[U, S, ~] = svd(W);
W1 = U * diag(1 ./ diag(S)) * U' * W;
方法二
[F, D] = eig(W * W');
W2 = F * diag(1 ./ sqrt(diag(D))) * F' * W;
%检查等效性
err = norm(W1 - W2) %#ok
@Brian:非常感谢你的回答。
我想我的问题不太清楚。
我的问题是关于对称去相关的,它基于以下公式:
W = [* (D ^ (1/2) * F '] * W
所以,我期待下面的命令在代码中:
W = U * diag(1 ./ sqrt(diag(S))) * U' * W;
而不是这个:
W = U * diag(1 ./ diag(S)) * U' * W;
再次感谢你的帮助。
默罕默德
@mohammad:这是正确的。这是证明:
%随机数据
W = randn(3,7);
%美白
[U, S, ~] = svd(W,'econ');
W = U * diag(1 ./ diag(S)) * U' * W;
验证协方差是否为恒等
covW = W * W' %#ok
你好布莱恩,
非常感谢您上传宝贵的代码。
当你使用对称解相关(Eq. 45)时,我们不需要对角矩阵取根吗?
W = U * diag(1 ./ diag(S)) * U' * W;
再次感谢
如何将数据导入到正确的格式取决于你自己。
你所要做的就是将数据加载到一个m x n的矩阵中,其中包含来自m个通道的n个(同步)样本,然后将该矩阵传递给myICA。
亲爱的布莱恩,
如果可能的话,你能回答这个问题吗?假设我有一个文本文件中的信号值。假设它是一个长度很大的整数数组。有没有可能我能用你的算法处理这个信号。
此外,如果我有2个通道的不同长度的波文件。我能从输出中检索到信号吗?
我已经附上了我的代码的副本,以检索原始信号从文本文件及其相应的直方图。我可以从中提取一个信号。
%%
清除所有;
clc;
x=fopen('C:\Users\pc\Documents\Limoges\My Biblio\CoolTerm Capture 2016-05-18 14-52-33.asc','r');
sig = fscanf (x, ' %我');
团体=团体* 3.3 / 1024/1100;
频率= 9600/16;
时间= 1 /频率;
n =长度(团体);
t = (0: (n - 1)) *;
f = fft (sig, n);
fff =频率/ 2:频率/ (n - 1):频率/ 2;
情节(t,团体);
情节(fff fftshift (f));
谢谢楼主的分享
亲爱的布莱恩,
非常感谢您的快速回复。是的,我希望心电图能独立于心电图和肌电图。但问题在于,它们有时会混在一起。我的主要目标是消除运动过程中产生的噪音,这种噪音是高度不可预测的,是由电线引起的。如果我从两对不同的导线上取两个a源。我会得到3个信号(一个来自ECG和2个来自每对接线的独立噪声)。目标是以某种方式将数据集放到matlab中并实时处理。但是我找不到任何资源。
你当然可以在你的多通道ECG数据上运行ICA,看看输出是什么样子。我没有医学应用方面的背景,但是如果心电信号真的独立于其他信号(脑电图、肌电图),那么你可能会看到一个组分离。
输入“help myICA”查看我的ICA实现的语法。
要去除50Hz的噪声,可能最好使用更经典的滤波方法,对吗?像这样:
//www.tatmou.com/help/dsp/ug/removing-high-frequency-noise-from-an-ecg-signal.html
如果您发现ICA在测试数据集上工作得很好,您可能想要谷歌“在线独立组件分析”,以了解人们如何修改ICA来处理流数据。
注意:我没有在线ICA的经验,特别是我的PCA和ICA包不支持它。金宝app
亲爱的布莱恩,
我正试图实现您的代码,以分离ECG信号与其相应的噪声(50HZ线噪声,脑电图信号,肌电图信号和身体的运动)。是否有可能使用你的算法使这种分离过滤掉单独的心电信号?
我还有一个问题。是否可以将您的代码应用于实时处理?例如,我正在使用具有多个通道的测量设备从患者收集心电图数据,它是否能够分离源并给我单独的输出?
亲爱的布莱恩,
我还有一个问题。是否可以将您的代码应用于实时处理?例如,我正在使用具有多个通道的测量设备从患者收集心电图数据,它是否能够分离源并给我单独的输出?
好的,非常感谢您的及时回复。我想我可以继续使用你的信息。
@Dominik:预白化只是将你的数据乘以一个特定的矩阵,这样“白化”数据的样本协方差就是单位矩阵。没有看到你的数据,我不能说太多,但你的数据的样本协方差一定是秩不足的,也就是说,有一个或多个非常小的特征值。
确保以m x n矩阵的形式传递数据,其中m = #个信号,n = #个样本。
你好布莱恩,
我要把肌电图记录分离成原始信号。但独立分量的振幅(e+005)确实比混合信号大得多。我猜这是因为预处理,即美白。你能告诉我为什么白化会使亮度变化到如此程度吗?
你好,杜米尼克
嗨脑. .
非常感谢您的工作,并提供它。
我想问一下ICA是否可以将歌曲中的器乐音轨分开。在音频信号中区分人声和音乐的最好方法是什么?
提前感谢……
你当然可以使用ICA进行图像分析,但听起来你是在进行某种研究项目,所以我认为你最好自己学习如何做。ICA是一种经典的技术,在网上有很多关于它的文献,只要搜索一下就可以了。如果您决定使用我的ICA代码,请随意阅读函数文档,它将告诉您如何使用它所需要知道的一切。
嗨大脑。
我想问一下您是否可以使用您的代码进行图像分析。
我想做的是分析一组医学图像,在身体的同一位置,在不同的时间点。
我试图分析这些图像,并将背景从原始图像中分离出来。在那之后,我想减少那部分身体的运动,因为呼吸。
谢谢
@Rajkumar:假设你有d个“混合语音”波形,每个波形有n个样本,你试图恢复r个潜在的语音波形。将混合语音波形放入d × n矩阵Z中并执行以下操作
Zica = myICA(Z,r);
Zpca = myPCA(Z,r);
阅读这两个函数的文档,看看返回的是什么。
注意:PCA可能对语音分离问题不起作用;这个经典问题经常被用作进行ICA的动力。
谢谢您宝贵的程序,先生…
如何可以用ICA和PCA分析技术从多个混合语音信号中进行语音检测,请问先生
先谢谢你,先生……
@Renan:欢迎你修改和重新发布代码——只要遵循下载中包含的BSD许可证的规则。
至于峰度转换的细节,我留给你们。首先,我推荐下面这篇文章:
http://mlsp.cs.cmu.edu/courses/fall2012/lectures/ICA_Hyvarinen.pdf
嗨,布莱恩。
我想用峰度度量,而不是高斯负。
第一个问题:我可以更改代码吗?我不会进行再分配,只是想看看这些措施之间的差异
第二个问题:你能引导我吗?我将使用峰度函数,可以在matlab上找到。我该怎么调整呢?
谢谢分享!
你好布莱恩,
这可能是一个非常简单的请求,但是Matlab版本的PCA有一种格式
[coeff, score, latent, tsquared, explained, mu] = pca(x)
[Zpca T U mu eigVecs] = myPCA(x,r)
…如何从您的版本获得与Matlab的pca相同的结果?
ICA绝对是将信号分解成独立光谱的好方法。洛伦兹分量的非零平均值是可以的:ICA算法的第一步是将数据居中(减去平均值),所以,如果工作正常,ICA应该输出一个零平均值的洛伦兹分量,没有问题。
正如我向Hamed提到的那样,我的ICA实现将在存在高斯函数的情况下失败,因为它的目标函数是最小化输出分量的高斯性。显然,当其中一个输出分量是高斯分布时,这是行不通的。
以下是我推荐尝试的其他几个(可能更好的)ICA软件包:
http://research.ics.aalto.fi/ica/fastica/code/dlcode.shtml
http://www.cis.hut.fi/projects/ica/fastica/
http://cogsys.imm.dtu.dk/toolbox/ica/
你好布莱恩,
非常感谢您的工作,并提供它。
我正在尝试用你的程序来分析一些化学混合物的紫外可见光谱数据。我知道混合物中有不止一种化合物,但少于不同温度下不同光谱的数量。在使用例程之前,我已经根据合成数据检查了例程,我使用高斯函数,三角函数和洛伦兹函数的线性组合修改demo_ICA。我注意到三角函数很容易被识别而洛伦兹函数和高斯函数则不然。我在对Hamed的回答中读到,这是因为高斯函数可以表示为其他高斯函数的和,但这对于洛伦兹函数是不成立的。即使是我的真实数据,当我试图分析它们时,我也会得到负的“光谱”作为独立的成分,这在物理上是不可能的。我不是信号处理方面的专家,我的印象是,问题的一部分可能是我的信号不像正弦和余弦那样具有零平均值。因为我读到这个方法也被用于医学研究在EEC和EEG中,我认为这是一个非常好的方法,也用于分析独立光谱的叠加。
提前感谢您的任何建议。
致以最亲切的问候
弗朗西斯科
@Hamed:独立高斯函数的和也是高斯函数,所以你的问题是不适定的:没有唯一的分解。
即使只有一个分量是高斯的,ICA仍然不起作用:它的目标函数是*最小化*输出信号的高斯性。
@Yeon-Mo Yang:抱歉耽搁了…rng()是一个内置的MATLAB函数,用于控制其随机数生成器。我使用它来设置生成器种子,因此myICA()的结果是确定的,但这不是必需的。你可以把这行注释掉,这是无害的。
rng()是在2010年左右引入的,所以你必须有一个2010年之前的MATLAB发行版…
你好再次,
我忘了说那些声音是独立的。
你好布莱恩,
我有两个正态分布的求和我想知道是否可以用ICA把它分解成两个正态分量。
谢谢你!
嗨,亲爱的Brian,非常感谢你的代码!
我加载了两个语音信号,Fs=16000和n=16000 (1sec),然后使用随机混合矩阵混合在一起。我给出了混合信号作为输入数据(Z)和r=2, d=2,但分离的源根本不好!估计的混合矩阵(A)也不正确。
我需要你的帮助!
谢谢你的代码,这对我很有帮助!
布莱恩!
源代码演示的第一行中的rng(1)是什么?
当我尝试时,它失败了。我需要你的帮助。谢谢!
@Thomas: ICA权重必须去相关,这样它们就不会收敛到相同的值。我的代码实现了FastICA算法(参考前面对这个包的多个注释);有关ICA算法的详细信息请参考文献。
对代码的唯一限制是计算复杂性:如果代码完成,一切都应该没问题。
在您给出的示例中,myPCA/myICA的输入需要是3 x 300000矩阵:列应该包含样本
再次抱歉,布莱恩,希望我没有打扰你。我可以知道为什么你需要在4步ICA实施后去关联你的权重矩阵吗?
还要检查一下你的算法在处理大型数据集时有什么限制吗?
因为我尝试用ICA_demo中的3个声音信号的300000x3矩阵替换您的MVG样本,并将myICA中的maxsamples替换为我的矩阵长度。
无论使用或不使用pca, ica的解混效果都很差。
相反,你的pca结果在大型数据集上是合理的。
@Thomas: SVD产生的主成分(PCs)是正交的,但它们不是单位范数,所以第二个白化步骤只是将每个成分归一化,使其具有单位范数(即T是对角矩阵)。
在许多应用中,PC *数量级*是重要的;在这种情况下,您需要注释掉第二个美白步骤。
我选择在默认情况下对pc进行规范化,以便与ICA进行直接比较,根据结构,ICA返回单位范数组件。
希望这对你有帮助!
嗨,布莱恩,希望这不是一个愚蠢的问题,介意我问pca,你中心和svd数据一次,但为什么你需要用svd再次漂白它?就像做了两次?
@zongbao:不可能。引用维基百科:
“一般来说,ICA无法识别源信号的实际数量,无法识别源信号的唯一正确顺序,也无法识别源信号的适当缩放(包括符号)。”
ICA的第一步是定心+白化,去除星等信息。实际上,在运行myICA()之后,您可以检查cov(z_ic') ==单位矩阵
我怎么能找到z_ic,对应于一个特定的特征值和特征向量?我的意思是我想找到对应于最大特征值的独立分量。谢谢你!
谢谢布莱恩!
@TS Sharma:是的,z_ic_new的列是每个输入样本对应的ICA系数(即,z_new的列)
参考你对我之前评论的回复,我认为是z_ic_new。
另一个基本问题。请问哪个矩阵包含ICA系数?
谢谢你,布莱恩!!你真是太好了。
@TS Sharma:首先,像这样调用myICA()
[z_ic A T mean_z] = myICA(z,NUM);
然后,如果新数据在(m x 1)向量z_new中,则可以通过计算将其投影到ICA空间中
z_ic_new = A * T * (z_new - mean_z);
其中(A,T,mean_z)分别为原始数据的ICA变换矩阵、白化矩阵和均值向量
谢谢你的代码。这是一个相当基本的问题。如何将新的(测试)数据投射到新发现的ICA基础上?
我们可以使用ica包进行特征提取吗?请回复。
谢谢你的包裹!!但如何用于语音信号??我对这个领域太陌生了。所以我才需要你的指导。
谢谢你这么漂亮的包裹。
这完全说得通。感谢您的快速回复!
@Kevin:混合矩阵是A,确实是正交的。看看myICA的最后一行。男:你会看到声明的
z_ic = A * z_cw;
它从白化的输入数据(z_cw)计算独立分量(z_ic)。
矩阵“T \ pinv(A)”将独立分量转换回原始(未白化)域,但通常不是正交的,因为白化矩阵“T”不是正交的。希望这对你有帮助!
谢谢你的包裹。
一个问题,根据我的理解,如果你将数据白化并居中,包含基函数的矩阵(混合矩阵)应该是正交的。当我运行代码并通过执行T \ pinv(A)(如myicam中指定的)获得混合矩阵时,得到的矩阵不是正交的。这是个问题吗?
先谢谢你
谢谢你提供这个包^_^
如何选择这种最佳算法的最佳维数?
谢谢的
@LA_2012:请阅读我之前的评论,了解更多关于我实现ICA的细节和文献参考。
要将ICA应用于图像,可以对每个图像进行矢量化,并将它们存储为输入矩阵的列
这个定点是ICA还是别的什么?
如何在图像上使用它?
如何根据其他ICA的要求修改代码?
我可以从哪里获得参考数据来更好地理解ICA ?
提前感谢:)
谢谢你提供这个代码
谢谢你分享你的代码,摩尔先生。
我正在使用您的ICA函数的一部分来实现我自己的。
我没有得到很好的结果使用权重向量去相关,因为你这样做了,所以我实现了由Hyvarinen pq 15 (http://mlsp.cs.cmu.edu/courses/fall2012/lectures/ICA_Hyvarinen.pdf).
以下是我在权值归一化之后插入的代码,仍然在for循环中:
% gram - schmidt
sum = 0 (0,1);
对于j = 1: p-1
wj = W(j,:)';
sum = sum + W(p,:)*wj*wj;
结束
W(p,:) = W(p,:) - sum ';
W(p,:) = W(p,:)/norm(W(p,:));
我明白了。非常感谢!
@Susanne:包含“gp”的for循环在第14页实现了算法的步骤2-3。因此,特别地,gp与文档中的g'(.)相关
好的,我想我对它有了更好的理解,谢谢你的代码给了我很大的帮助。我有一个问题,你在ICA代码中使用的gp是什么?
@Body:不,“err”向量跟踪权重向量在每次迭代中变化的程度(仅用于停止标准)。如果你按照你的建议去做,你将只是测量每个权重向量与单位范数的接近程度(*剧透警报* -它们总是单位范数)。
@Susanne:我建议你阅读myICA的帮助信息和评论。m函数。如果你需要更多的细节,你需要参考文献。举个例子
http://mlsp.cs.cmu.edu/courses/fall2012/lectures/ICA_Hyvarinen.pdf
仅供参考:我在第14页使用了4步算法,并在第15页使用了涉及(45)中的W矩阵的对称去相关步骤
谢谢你的代码!ICA太难理解了。你帮了大忙了!我有一个问题。可以
Err (i) = 1 - w(i,:) * w(i,:)'
而不是
Err (i) = 1 - w(i,:) * w_old(i,:)'?
我很难完全理解他们使用的ICA算法。你介意帮我一下吗?
@LionelB:说得好,我对自己没有提到bsxfun()感到很失望——它是MATLAB的矢量化秘方
甚至
Z0 = bsxfun(@ -,z,sum(z,2)/n);
R = (z0*z0')/(n-1);
:) (Matlab在内部使用这种习惯用法,参见'cov'函数)。
无论如何,我之所以提出这个问题,是因为我几乎放弃了你的精美包装,直到我意识到这个修复是微不足道的。
@LionelB:是的,我知道。我编写了MATLAB代码,这样它就可以直接翻译成,例如c++。如果我要最大化MATLAB的效率,我会写
Z0 = (1 / (n - 1)) * (z - repmat(mean_z,[1 n]));
R = z0 * z0';
而不是
Z0 = z - mean_z*ones(1,n);
R = (z0*z0') / (n-1);
不错的包,但是' mywhite '例程对于大型数据集来说是一个可怕的计算瓶颈,因为它的样本协方差计算效率低下。这可以很容易地在不循环的情况下完成:只需简化z,例如:
Z0 = z-mean_z*ones(1,n);
然后计算
R = (z0*z0')/(n-1)
提供一个数量级的加速。
是的,我说的是z_LD,我担心它对解决方案可能是一个太强的限制,因为我不是这种分析的专家,这是我第一次发现计算低维z的可能性。
谢谢你的回答。
你指的是myICA帮助中描述的“z_LD”吗?它是一个与输入z大小相同的矩阵它通过输出z_ic中独立分量NUM的线性组合来近似z
谢谢你的分享,我有一个问题。
我用的是你的myICA。我和我想知道ICA_LD到底是做什么的。
如果可能的话,你能建议做一些关于它的讲座或简短的解释吗?
非常感谢
@Prarinya看看来自
http://mlsp.cs.cmu.edu/courses/fall2012/lectures/ICA_Hyvarinen.pdf
我在第14页使用4步算法,同时在第15页使用涉及(45)中的W矩阵的对称去相关步骤
干杯!
伟大的贡献。我有个请求
你能告诉我们你使用的算法的参考吗?我对在代码中创建转换矩阵“A”的更新规则很好奇。
我试着从地面开始研究ICA算法。但是你使用的更新规则与我的文档有很大的不同。因此,我意识到有不止一种方法来更新变换矩阵。
比FastIca好多了;)
超级好
皮埃尔,
您必须使用旧版本的MATLAB(我相信<= 2009b),其中不支持~。金宝app请把这条线换成
[U,S,temp] = svd(w,'econ');
变量temp没有被使用;这个名字是任意的
你好,谢谢你提供这个代码!超级有用。
ICA上的第97行返回一个错误
[U,S,~] = svd(w,'econ');
它似乎讨厌~作为输出
我错过什么了吗?
先生,第31行有错误。你能解决这个问题吗?谢谢你提供这个文件。
为什么尤金的排名是2星?请提供反馈,以便我改进这个包!