2017-10-16 3 views
0

J'ai une matrice R que je veux estimer en utilisant la méthode de descente en gradient. Le code fonctionne bien pour une matrice de petite dimension (par exemple 100 x 1) mais il donne des valeurs de NaN lorsque j'augmente la dimension (par exemple 10x3). S'il vous plaît aider!Descente en gradient pour les petites et grandes valeurs de la matrice multidimensionnelle

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'; 

Répondre

0

Votre problème réside dans la boucle for. Le plus grand matlab double peut stocker est 1.7977e+308, après 7 exécutions de la boucle vos valeurs pour P et Q sont de l'ordre de 10^101 et après 8 exécutions inf. Je ne suis pas sûr de ce que vous entendez par matrice d'estimation, mais vos valeurs nan proviennent de la façon dont P et Q grandissent si rapidement. Une autre chose à noter, la variable mse2 n'est pas utilisée. Quel est son but?

+0

En fait, il s'agit d'un problème d'achèvement de la matrice pour remplir les entrées manquantes par rapport à la matrice originale R. Donc, mse 2 se situe entre les valeurs de l'original R et les valeurs de R R estimé. –

+0

Je suis incapable de comprendre pourquoi les valeurs deviennent si grandes dans la matrice multidimensionnelle. –

+0

Définissez un point d'arrêt dans la boucle for et parcourez-le pour voir comment les variables se développent. –