2016-02-11 63 views
0

我提出了一个有趣和有用的问题,需要在MATLAB中进行。这是关于编程的效率,避免使用循环”迭代在MATLAB中避免循环的矩阵

假设一个矩阵URm产品。矩阵元素是人们对这些产品评级,和这个矩阵是稀疏由于每个人正常率仅少数产品。

URm [n_u, n_i] 

另一个马感兴趣TRIX是F,它包含属性为每个产品和属性的长度是固定的:

F [n_f,n_i] 

我们把URm成两个子矩阵中随机:URmTrainURmTest其中前者被用于训练系统和后者进行测试。这两个矩阵具有相似的行(用户),但它们可能有不同数量的列(产品)。

我们可以找到非常快使用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 

其中URmpURm的预测版本我们可以计算出我们的预测有多好的错误。

让我们做一个简单的例子。让我们假设用户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,可以帮助尽快加快这个过程。谢谢

+1

我建议你添加一个工作循环的例子,这将更清楚地解释你想要达到的目标。 –

+0

安德拉斯,感谢您的评论。如果我们能回答这个问题,超过50%的问题就解决了。请考虑我给出的例子,其中indTrain是可变长度,但indTest的长度是1.我们可以编写避免循环的预测公式吗? – Yas

+2

我之前的评论可能对我有点被动。以下是直接版本:我不知道你准备做什么。我很乐意为你进行矢量化,但为此你需要明确地指出你的问题。就编程问题而言,*代码*尽可能清晰。 –

回答

1

我还不确定我完全理解你的问题。但在我看来,如果你预先计算s_ij作为

s_ij = F.' * F %'// [ni x ni] matrix 

那么你是什么根本

URmTestp(u,indTest) = URmTrain(u,indTrain) * s_ij(indTrain,indTest); 
% or 
%URmTestp(u,:) = URmTrain(u,indTrain) * s_ij(indTrain,:); 

后,或者如果你只计算一个小s_ij块只进行必要的阵列,

s_ij = F(:,indTrain).' * F(:,indTest); 

然后

URmTestp(u,indTest) = URmTrain(u,indTrain) * s_ij; 

或者,您也可以随时计算的s_ij必要的子块上飞:

URmTestp(u,indTest) = URmTrainp(u,indTrain) * F(:,indTrain).'*F(:,indTest); 

如果我理解正确的是indTestindTrainu功能,如

URmTestp = zeros(n_u,n_i); %// pre-allocate here! 
for u=1:n_u 
    indTest = testCell{u}; 
    indTrain = trainCell{u}; 
    URmTestp(u,indTest) = URmTrainp(u,indTrain) * F(:,indTrain).'*F(:,indTest); %' 
    ... 
end 

那么很可能不很多都可以在这个循环中进行矢量化,除非有一个棘手的索引方案,允许您使用线性索引。我会坚持这个设置。

+0

感谢您的评论。请根据您的意见,找到我修改的问题。同样,您可以修改您的回复以符合原始问题,以便进行明确的讨论。有了这个,我们可以避免我写的循环吗? – Yas

+0

@是的,我更新了我的答案。让我知道如果我误解了,我仍然不确定我是否正确理解你的问题:) –

+0

这不是我要求的,但你的回答包含有用的信息。谢谢安德拉斯!现在问题解决了 – Yas