2017-10-16 7 views
0

私は勾配降下法を使って推定したい行列Rを持っています。コードは小さな次元行列(例えば100x1)に対して良好に働いていますが、次元を大きくするとNaN値が得られます(例:10x3)。助けてください!多次元行列の小さな値と大きい値の勾配降下

R =[196,242,3;186,302,3;22,377,1;244,51,2;166,346,1;298,474,4;115,265,2;253,465,5;305,451,3;6,86,3]; 
N = length(R); 
M = size(R,2); 
K = 3; 

P = rand(N,K); 
Q = rand(M,K); 
alpha = 0.002; 
beta = 0.02; 


for iter = 1 : 5000 
e = R - P*Q'; 
P_new = P + 2*alpha*(e*Q-beta*P); 
Q_new= Q + 2*alpha*(e'*P-beta*Q); 
mse2(iter) = norm(R - P*Q')/norm(R); 

P=P_new; 
Q=Q_new; 
end 

R_est = P*Q'; 

答えて

0

問題はforループにあります。最大のダブルmatlabには1.7977e+308が格納できます。ループが7回実行された後、PとQの値は10^101のオーダーで、8回の実行後にはinfになります。私はあなたが推定行列によって何を意味するのかは分かりませんが、あなたのnanの値はPのQが急速に成長する方法から来ています。注記の他の1つは、mse2変数は使用されません。その目的は何ですか?

+0

実際には、これは元の行列Rに対して欠落したエントリを埋めるための行列補完問題です。したがって、mse 2は元のRの値と推定R R_estの値の間にあります。 –

+0

多次元行列で値が大きくなる理由を理解できません。 –

+0

forループにブレークポイントを設定し、変数をどのように拡大するかを調べます。 –

関連する問題