解决广义特征向量和特征值以获取公共基础。

4

我希望解决在Matlab中广义特征向量和特征值问题。为此,我已经尝试了两种方法。

  1. 如果广义问题被公式化为:

generalized problem

那么,我们可以在每一侧乘以B^(-1),如下:

other formulation

从理论角度来看,这是一个简单而经典的特征值问题。

最后,在Matlab中,我只需使用A=FISH_spB=FISH_xc

[Phi, Lambda] = eig(inv(FISH_xc)*FISH_sp);

然而,当我进行简单的Fisher合成后,结果不正确(限制条件太严格,导致出现nan值)。我不知道为什么我的结果与下面第二个方法的结果不同。

  1. 第二种方法来源于以下论文

总之,在第7页上描述了使用的算法。我按照这个算法的所有步骤进行,似乎在进行Fisher综合时给出了更好的结果。

这里是感兴趣的部分(很抱歉,我认为在stakoverflow上没有Latex):

generalized eigenvectors and eigenvalues的描述

这是我为此方法编写的小型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)。

  1. 现在,我想把这个广义问题与A和B矩阵(分别是Fish_sp和Fish_xc)之间的共同特征向量联系起来。是否有一种方法可以进行这样的操作?

事实上,我所做的工作是在A×PhiB×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_spFISH_xc列)

在论文中,他们说phi对于A=FISH_spB=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 V
@MatteoV。感谢您的建议,您是正确的:我已经用phiB_bar = V2*(D2.^(0.5)+1e-10*eye(7))^(-1)替换了。但是,phi仍然没有出现为A=FISH_spB=FISH_xp的特征向量,这真是令人沮丧... - user1773603
刚刚用两个5x5的随机矩阵进行了快速测试,方法1似乎是正确的(在我的情况下norm(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
@pH74 是的,我可以直接使用[V,D] = eig(A,B) 进行计算,但我想在A和B之间建立一个共同特征向量基础的联系。有人建议我看一下“联合对角化”的问题,它有两个变体:正交的,其中基向量是正交的,非正交的则更难解决,但可能更适合您的应用。您可以在这里查看此建议:https://scicomp.stackexchange.com/questions/36670/matlab-compute-approximative-common-eigenvectors-basis-between-two-matrices-as。 - user1773603
但我不知道如何将这个联合对角化与广义特征值问题联系起来。 - user1773603
1个回答

0
你定义了 barA = inv(phiB_bar)*FISH_sp*phiB_bar。从手稿中的公式(39)来看,应该改为 barA = transpose(phiB_bar)*FISH_sp*phiB_bar
此外,当 B 是奇异矩阵时,你的方法1会失败(不存在逆矩阵)。如果我没记错的话,MATLAB 的 eig(A,B) 可以处理奇异的 B

这个错误对约束的影响太小了,但很高兴你发现了它,已经修复了。关于矩阵B,我只处理B而不是奇异的,因为我经常使用B的逆(它等于由B表示的探针的协方差),所以不用担心。最好的问候。 - user1773603

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接