我坚持在 MATLAB/Octave 中对这个棘手的循环进行矢量化:
[nr, nc] = size(R);
P = rand(nr, K);
Q = rand(K, nc);
for i = 1:nr
for j = 1:nc
if R(i,j) > 0
eij = R(i,j) - P(i,:)*Q(:,j);
for k = 1:K
P(i,k) = P(i,k) + alpha * (2 * eij * Q(k,j) - beta * P(i,k));
Q(k,j) = Q(k,j) + alpha * (2 * eij * P(i,k) - beta * Q(k,j));
end
end
end
end
该代码尝试将 R 分解为 P 和 Q,并使用更新规则逼近最近的 P 和 Q。例如,设 R = [3 4 0 1 1; 0 1 0 4 4;5 4 3 1 0;0 0 5 4 3;5 3 0 2 1],K=2,α=0.01,β=0.015。在我的真实案例中,我将使用一个巨大的稀疏矩阵 R(这就是我需要向量化的原因),而 K 仍然很小(小于 10)。整个脚本的目标是根据非零元素为 R 中的每 0 个元素生成一个预测值。我从这里得到了这段代码,最初是用 Python 编写的。