我希望解决在Matlab中广义特征向量和特征值问题。为此,我已经尝试了两种方法。
- 如果广义问题被公式化为:
那么,我们可以在每一侧乘以B^(-1),如下:
从理论角度来看,这是一个简单而经典的特征值问题。
最后,在Matlab中,我只需使用A=FISH_sp
和B=FISH_xc
:
[Phi, Lambda] = eig(inv(FISH_xc)*FISH_sp);
然而,当我进行简单的Fisher合成后,结果不正确(限制条件太严格,导致出现nan
值)。我不知道为什么我的结果与下面第二个方法的结果不同。
- 第二种方法来源于以下论文。
总之,在第7页上描述了使用的算法。我按照这个算法的所有步骤进行,似乎在进行Fisher综合时给出了更好的结果。
这里是感兴趣的部分(很抱歉,我认为在stakoverflow上没有Latex):
这是我为此方法编写的小型Matlab脚本:
% Diagonalize A = FISH_sp and B = Fish_xc
[V1,D1] = eig(FISH_sp);
[V2,D2] = eig(FISH_xc);
% Applying each step of algorithm 1 on page 7
phiB_bar = V2*(D2.^(0.5)+1e-10*eye(7))^(-1);
barA = inv(phiB_bar)*FISH_sp*phiB_bar;
[phiA, vA] = eig(barA);
Phi = phiB_bar*phiA;
最终,我找到了phi特征向量矩阵(phi)和lambda对角矩阵(D1)。
- 现在,我想把这个广义问题与A和B矩阵(分别是Fish_sp和Fish_xc)之间的共同特征向量联系起来。是否有一种方法可以进行这样的操作?
事实上,我所做的工作是在A×Phi
和B×Phi
之间找到了一种平行关系,由Lambda对角矩阵连接。也许,我们可以调整这种关系,使之变成:
A*Phi'=Phi'*Lambda_A'
and
B*Phi'=Phi'*Lambda_B'
从数字的角度看,为什么我在方法1)和方法3)中得到的结果不同呢?我指的是关于phi特征向量矩阵和lambda对角矩阵。
然而,这是相同的公式。
编辑:
如果我想说phi对A=FISH_sp和B=FISH_xc矩阵都进行对角化,那么我的结果是错误的。实际上,通过以下方式:
% Marginalizing over uncommon parameters between the two matrices
COV_GCsp_first = inv(FISH_GCsp);
COV_XC_first = inv(FISH_XC);
COV_GCsp = COV_GCsp_first(1:N,1:N);
COV_XC = COV_XC_first(1:N,1:N);
% Invert to get Fisher matrix
FISH_sp = inv(COV_GCsp);
FISH_xc = inv(COV_XC);
% Diagonalize
[V1,D1] = eig(FISH_sp);
[V2,D2] = eig(FISH_xc);
% Build phi matrix
% V2 corresponds to eigen vectors of FISH_xc
phiB_bar = V2*diag(diag(D2.^(-0.5)));
% DEBUG : check identity matrix => OK, Identity matrix found !
id = (phiB_bar')*FISH_xc*phiB_bar
% phi matrix
barA = (phiB_bar')*FISH_sp*phiB_bar
[phiA, vA] = eig(barA);
phi = phiB_bar*phiA;
% Check eigen values : OK, columns of eigenvalues found !
FISH_sp*V1./V1
% Check eigen values : OK, columns of eigenvalues found !
FISH_xc*V2./V2
% Check if phi diagolize FISH_sp : NOT OK, not identical eigenvalues
FISH_sp*phi./phi
% Check if phi diagolize FISH_sp : NOT OK, not identical eigenvalues
FISH_xc*phi./phi
所以,我认为特征向量矩阵Phi不能对A和B进行对角化,因为预期的特征值不是相同值的列。
顺便说一句,我发现从以下方式得到的特征值D1和D2:
[V1,D1] = eig(FISH_sp);
[V2,D2] = eig(FISH_xc);
% Check eigen values : OK, columns of eigenvalues D1 found !
FISH_sp*V1./V1
% Check eigen values : OK, columns of eigenvalues D2 found !
FISH_xc*V2./V2
我该如何修复这个错误的结果(我指的是比率):
FISH_sp*phi./phi
FISH_xc*phi./phi
(其中不会给出相同的值对于FISH_sp
和FISH_xc
列)
在论文中,他们说phi
对于A=FISH_sp
和B=FISH_xc
进行了对角化,但我无法复现。
如果有人能够看到我的错误所在...
phiB_bar = V2*(D2.^(0.5)+1e-10*eye(7)^(-1))
存在一个错误:根据论文中的公式应该是phiB_bar = V2*inv(D2.^(0.5)+1e-10*eye(7));
,不是吗? - Matteo VphiB_bar = V2*(D2.^(0.5)+1e-10*eye(7))^(-1)
替换了。但是,phi
仍然没有出现为A=FISH_sp
和B=FISH_xp
的特征向量,这真是令人沮丧... - user1773603norm(A*phi - B*phi*lambda) = 1.933967216188714e-14
),而对于方法2,它返回norm(A*phi - B*phi*lambda) = 2.228744851244737
。也许论文中有一些潜在的假设(免责声明:我没有阅读过它)? - Matteo V[V, D] = eig(A, B)
应该解决广义特征值问题A*V = B*V*D
。如果这对您的问题不起作用,请访问math.stackexchange.com以获取有关论文的问题。 - pH 74[V,D] = eig(A,B)
进行计算,但我想在A和B之间建立一个共同特征向量基础的联系。有人建议我看一下“联合对角化”的问题,它有两个变体:正交的,其中基向量是正交的,非正交的则更难解决,但可能更适合您的应用。您可以在这里查看此建议:https://scicomp.stackexchange.com/questions/36670/matlab-compute-approximative-common-eigenvectors-basis-between-two-matrices-as。 - user1773603