2017-03-10 16 views
3

私はそのe.v.に分解しようとしている疎、実対称の行列を持っています。 奇妙なことである:私は関数eigsを使用してトップ20固有ベクトルを計算する場合、私はトップ50を計算した後、上部20非常に奇妙な結果を返すMATLABのeigs

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) 
  • 表示機能で取り出す場合よりも、私は異なる結果を得ます私はそれらのEVを再構成し、トップ20(第5引数)を表示しました。

これは、固有ベクトルが一意ではないという事実によって説明できますか? 他の洞察は高く評価されます。 eigs以来

おかげ

+1

'eig'を使ってすべての固有ベクトルを計算し、最初の20個を選択するとどうなりますか?また、投稿したコードが自然に実行できないため、最小限の作業例(MWE)を提供できればいいです。 – UJIN

+0

「私は別の結果を得ます....」結果とはどのようなもので、どう違いますか? – TroyHaskin

答えて

2

ジョンin a mathworks postによると

This is because eigs uses a random start

そのマニュアルを通読するのに時間がかかることができ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); 

:第1の上面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.の数としてのは、それらの行を追加し、エラーで何が起こるか見てみましょうスピード性能を保証するために、ある程度の公差が緩められているので、誤差が増大する。

+1

しかし、OPは 'opts.v0'によって固定初期化ベクトルを定義しました... – TroyHaskin

+0

@TroyHaskinは私の編集でもっと意味をなさないでしょうか? – Yvon

+1

です。しかし、私はまだ、この時点でむしろあいまいなので、OPが「異なる」と定義するものを見るのを待っています。 – TroyHaskin