MATLAB eigs 返回非常奇怪的结果
MATLAB's eigs returning very odd results
我有一个稀疏的实数对称矩阵,我正在尝试将其分解为 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)
- Display 是我编写的一个函数,它重塑那些 E.V 并显示前 20 个(第 5 个参数)。
这可以用特征向量不唯一这一事实来解释吗?
任何其他见解将不胜感激。
谢谢
根据约翰 in a mathworks post
This is because eigs uses a random start
由于 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。增加误差增长,因为 "some" 放宽容差以保证速度性能。
我有一个稀疏的实数对称矩阵,我正在尝试将其分解为 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)
- Display 是我编写的一个函数,它重塑那些 E.V 并显示前 20 个(第 5 个参数)。
这可以用特征向量不唯一这一事实来解释吗? 任何其他见解将不胜感激。
谢谢
根据约翰 in a mathworks post
This is because eigs uses a random start
由于 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。增加误差增长,因为 "some" 放宽容差以保证速度性能。