基于item协同过滤算法实现

基于item协同过滤算法:利用的是item组成相似性矩阵,这里我们是基于电影协同过滤算法实现

基于item协同过滤算法实现_第1张图片

现在要给所有的用户推荐电影

首先我们要计算电影之间的相似度,相似度用皮尔逊相关来求电影之间的相似性。

基于item协同过滤算法实现_第2张图片

求出相识度如下表所示

基于item协同过滤算法实现_第3张图片

比如我们要给A推荐电影,那么根据A看过的电影与其他电影相似度,进行加权评分,得出要给A推荐的电影。

如表是我们要给所有用户推荐的电影,其中0代表该用户看过电影,不需要推荐。

基于item协同过滤算法实现_第4张图片

从表中我们可以看出给A推荐最高的电影是4,即寻龙诀电影推荐给A用户。

代码如下所示:

电影相似度代码:

load('score.mat');
[rowsize,colsize] = size(A);
sim = zeros(colsize);
%% Pearson相关系数求电影相似性
for i = 1:colsize-1
    for j = i+1:colsize
        sum1=0;
        sum2=0;
        sum3=0;
        sum4=0;
        sum5=0;
        temp = A(:,i)&A(:,j);
        index = find(temp);
        for k = 1:size(index,1)
            sum1 = sum1 + A(index(k),i)*A(index(k),j);
            sum2 = sum2 + A(index(k),i);
            sum3 = sum3 + A(index(k),j);
            sum4 = sum4 + A(index(k),i)^2;
            sum5 = sum5 + A(index(k),j)^2;
        end
        sum23 = (sum2 * sum3)/k;
        sum42 = sum4 - sum2^2/k;
        sum53 = sum5 - sum3^2/k;
        if (sum42~=0&&sum53~=0)
            sim(i,j)=(sum1 - sum23)/sqrt(sum42 * sum53);
        end
    end
end


给用户推荐电影评分代码:

%% 给用户推荐电影评分
predict_score = zeros(rowsize,colsize);
for i = 1:rowsize
    %% 找到用户已评价的电影的索引
    find_temp = find(A(i,:));
    %% 找到用户没有评价的电影索引
    ufind_temp = find(A(i,:)==0);
    %% 预测用户没有评价电影的评分值
    for j = 1:size(ufind_temp,2)
        %% 利用某用户对所有评价电影乘以未评价电影相似度
        for k=1:size(find_temp,2)
            predict_score(i,ufind_temp(j)) = predict_score(i,ufind_temp(j)) + A(i,find_temp(k))*sim(find_temp(k),ufind_temp(j));
        end
    end
end
欢迎大家一起探讨学习


你可能感兴趣的:(协同过滤推荐算法)