我提出了一个有趣和有用的问题,需要在MATLAB中进行。这是关于编程的效率,避免使用循环”迭代在MATLAB中避免循环的矩阵
假设一个矩阵URm
其列是产品和行是人。矩阵元素是人们对这些产品评级,和这个矩阵是稀疏由于每个人正常率仅少数产品。
URm [n_u, n_i]
另一个马感兴趣TRIX是F
,它包含属性为每个产品和属性的长度是固定的:
F [n_f,n_i]
我们把URm
成两个子矩阵中随机:URmTrain
和URmTest
其中前者被用于训练系统和后者进行测试。这两个矩阵具有相似的行(用户),但它们可能有不同数量的列(产品)。
我们可以找到非常快使用pdist()
或矩阵转置项目之间的相似性:
S = F * F' ;
对于每一行(用户)在URmTest
:
URmTestp = zeros(size(URmTest));
u = 1 ; %% Example user 1
for i = 1 : size(URmTest,2)
indTrain = find(URmTrain(u,:)) ; % For each user, search for items in URmTrain that have been rated by the the user (i.e. the have a rating greater than zero)
for j = 1 : length(indTrain)
URmTestp(u,i) = URmTestp(u,i) + S(i,indTrain(j))*URmTrain(u,indTrain(j))
end
end
其中URmp
是URm
的预测版本我们可以计算出我们的预测有多好的错误。
例
让我们做一个简单的例子。让我们假设用户1额定项目3,5项和17:在URmTest
indTrain = [3 5 17]
对于每个项目j
,我想用下面的公式来预测评级:
URmTestp(u,j) = S(j,3)*URmTrain(u,3) + S(j,5)*URmTrain(u,5) + S(j,17)*URmTrain(u,17)
一旦完成这个过程需要为所有用户重复。
由于URm
通常非常大,我更喜欢使用最少量的“循环”的选项。我们可能会利用bsxfun
,但我不确定我们是否可以。
请建议我ides,可以帮助尽快加快这个过程。谢谢
我建议你添加一个工作循环的例子,这将更清楚地解释你想要达到的目标。 –
安德拉斯,感谢您的评论。如果我们能回答这个问题,超过50%的问题就解决了。请考虑我给出的例子,其中indTrain是可变长度,但indTest的长度是1.我们可以编写避免循环的预测公式吗? – Yas
我之前的评论可能对我有点被动。以下是直接版本:我不知道你准备做什么。我很乐意为你进行矢量化,但为此你需要明确地指出你的问题。就编程问题而言,*代码*尽可能清晰。 –