基于item协同过滤算法:利用的是item组成相似性矩阵,这里我们是基于电影协同过滤算法实现
现在要给所有的用户推荐电影
首先我们要计算电影之间的相似度,相似度用皮尔逊相关来求电影之间的相似性。
求出相识度如下表所示
比如我们要给A推荐电影,那么根据A看过的电影与其他电影相似度,进行加权评分,得出要给A推荐的电影。
如表是我们要给所有用户推荐的电影,其中0代表该用户看过电影,不需要推荐。
从表中我们可以看出给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
欢迎大家一起探讨学习