2017-10-16 4 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 루프에 있습니다. 최대 double matlab에 저장할 수있는 코드는 1.7977e+308입니다. 루프가 7 회 실행 된 후 P와 Q의 값은 10^101이고 실행이 끝난 후 inf이됩니다. 나는 당신이 추정 행렬에 의해 무엇을 의미하는지 확신하지 못하지만, 당신의 nan 값은 P가 Q가 그렇게 빨리 성장하는 길에서 오는 값입니다. 하나의 다른 참고 사항, mse2 변수는 사용하지 않아야합니다. 그 목적은 무엇입니까?

+0

사실 이것은 원래 행렬 R에 대해 누락 된 항목을 채우는 행렬 완료 문제입니다. 따라서 mse 2는 원래 R 값과 예상 R R_est 값 사이에 있습니다. –

+0

왜 다차원 매트릭스에서 값이 커지게되는지 알아낼 수 없습니다. –

+0

for 루프에 중단 점을 설정하고 단계별로 진행하여 변수가 어떻게 커지는 지 확인하십시오. –