我有一个稀疏的,真实的,对称的矩阵,我试图分解成它的e.v. 奇怪的是:如果我使用eigs计算前20个特征向量,我得到的结果与我计算前50个然后挑出前20个不同。
opts.v0 = rand(size(K,1),1);
opts.p = 100;
n_ev = 20;
[V,D] = eigs(K, n_ev,'lm',opts);
Display(V,79,95,size(V,1)/(79*95),20)
n_ev = 50;
[V,D] = eigs(K, n_ev,'lm',opts);
Display(V,79,95,size(V,1)/(79*95),20)
n_ev = 70;
[V,D] = eigs(K, n_ev,'lm',opts);
Display(V,79,95,size(V,1)/(79*95),20)
这可以通过特征向量不唯一的事实来解释吗? 任何其他见解将受到高度赞赏。
由于
答案 0 :(得分:2)
这是因为eigs使用随机启动
由于eigs
是ARPACK库,因此阅读其文档可能会非常耗时。然而,我们可以假设1)它不试图求解逆矩阵和2)涉及随机数,因此输出具有随机误差。
完成了一项实验:
clear;clc;close all
K = randn(100);
N = 20;
DD = zeros(N,10);
for ii = 1:10
[V,D] = eigs(K, N,'lm');
DS = diag(D);
[~,DI] = sort(abs(DS),'descend');
DS = DS(DI);
DD(:,ii) = DS;
end
DN1 = abs(DD);
N = 50;
DD = zeros(N,10);
for ii = 1:10
[V,D] = eigs(K, N,'lm');
DS = diag(D);
[~,DI] = sort(abs(DS),'descend');
DS = DS(DI);
DD(:,ii) = DS;
end
DN2 = abs(DD);
DN2 = DN2(1:20,:);
N = 20;
DD = zeros(N,10);
for ii = 1:10
[V,D] = eigs(K, N,'lm');
DS = diag(D);
[~,DI] = sort(abs(DS),'descend');
DS = DS(DI);
DD(:,ii) = DS;
end
DN3 = abs(DD);
遵循您的程序:首先是前20名,然后是前50名,然后是前20名。在每个步骤中,相同的程序重复10次。
我已经保存了每一步的前20名,并进行了快速比较:
Err = (sum((DN1-DN2).^2+(DN2-DN3).^2+(DN1-DN3).^2,1)).^.5;
>> Err
Err =
Columns 1 through 6
0.0000 0.0000 0.0000 0.0870 0.0000 0.0000
Columns 7 through 10
0.0000 0.0000 0.0870 0.0870
>> min(Err),max(Err)
ans =
3.1665e-13
ans =
0.0870
>>
大多数情况下,错误与eps(1)
相当,但有一些错误很大。这表明,为了产生可靠的结果,可能需要重复计算和平均。
然而,如果你的问题仅仅是他们的问题(我想我现在明白了你的观点),你可以在评估后sort
向量关于幅度。我的实验应该能够证明sort
前20名总是相同的。
编辑:正如@TroyHaskin在评论中指出的那样,你已经定义了opts
(我公然删除它)来定义随机种子。让我们添加这些行,看看错误会发生什么:
Err =
Columns 1 through 6
0.0016 0.0016 0.0016 0.0016 0.0016 0.0016
Columns 7 through 10
0.0016 0.0016 0.0016 0.0016
可能(猜测)的解释:作为感兴趣的e.v.的数量。由于“一些”公差被放宽以保证速度性能,因此增加了误差。