MATLAB的回归非常奇怪

时间:2017-03-10 17:44:34

标签: matlab eigenvector

我有一个稀疏的,真实的,对称的矩阵,我试图分解成它的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)
  • 显示是我写的一个函数,它重塑了那些E.V'并显示前20(第五个参数)。

这可以通过特征向量不唯一的事实来解释吗? 任何其他见解将受到高度赞赏。

由于

1 个答案:

答案 0 :(得分:2)

根据约翰in a mathworks post

  

这是因为eigs使用随机启动

由于eigsARPACK库,因此阅读其文档可能会非常耗时。然而,我们可以假设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.的数量。由于“一些”公差被放宽以保证速度性能,因此增加了误差。