%% 载入训练数据
load u1.base;
%% 数据预处理
% 提取数据的前三列,即用户序号、被该用户评价电影序号、评价分值
[m,n]=size(u1);
test=zeros(m,3);
for i=1:3
test(:,i)=u1(:,i);
end
%% 建立评分矩阵
%并不是行数就是用户数,因为一个用户评价多个电影;为什么最大值就对了呢?观察数据集u1.base会发现,已经排好序了,
% 而且每个用户都有评分;实际上对u.user的行数就是用户数
%实际上这样不严谨?要是由用户没评分呢?要是有点硬没被评分呢?或许做过处理了吧
%也可能是只是求所有电影数目,不管这个文件里存在什么,是的,就是这个
number_user=max(test(:,1));
number_movies=max(test(:,2));
score_matrix=zeros(number_user,number_movies);%评分矩阵
for i=1:m
score_matrix(test(i,1),test(i,2))=test(i,3);
end
Sim_matrix=zeros(number_movies,number_movies);%相似度矩阵
tic;
%计算评分矩阵
for i=1:number_movies-1
for j=i+1:number_movies
Sim_matrix(i,j)=Similarity_ab(score_matrix,i,j);
end
end
toc;
%% 建立相似度矩阵
neibor_num=10;%邻居的大小
Sim_matrix=Sim_matrix'+Sim_matrix;%求完整的相似度矩阵,就是形成对称矩阵
%neibor_sim_matrix_temp为排好序的相似度矩阵
%neibor_matrix_temp各个相似度所对应的电影,也就是我们要找的邻居
value_1_index=find(Sim_matrix>=0.9999);%找出Sim_matrix矩阵中所有相似度为1的值,
%因为可能是错误值,后期选择邻居不应考虑。
%为什么不是value_1_index=find(Sim_matrix==1)这样有部分1不能正确找出,可以试试看
Sim_matrix(value_1_index)=0;%将所有相似度为1的值用0代替
%% 载入测试集
load u11.test;
%% 作预测
[m,n]=size(u11);
test=zeros(m,3);
for i=1:3
test(:,i)=u11(:,i);
end
Predict_score=zeros(m,1);
for j=1:m
%score_matrix来自于训练集
P_u=find(score_matrix(test(j,1),:)~=0);%找出该用户评价的电影集合
[~,num]=size(P_u);%计算该用户评价的电影个数
%%%%%%%%%%%计算邻居%%%%%%%%%%%%
neibor_num=10;%最大为4
P_u_sim=Sim_matrix(test(j,2),P_u);
%index显示的是原来的位置,不过不会递增,按行排序的话,index每行都是1到列数
[temp,index]=sort(P_u_sim,2,'descend');%按行降序排列
[~,num1]=size(index);
if num1>=neibor_num
neibor=(P_u(index(1:neibor_num)));
else
neibor=(P_u(index));
neibor_num=num1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sum_score=sum(score_matrix(test(j,1),:),2);%该用户对所有电影的总评分
aver_score=sum_score/num;%该用户对电影的平均评分
sum1=0;
sum2=0;
for i=1:neibor_num
sum1 = sum1+Sim_matrix(test(j,2),neibor(i))*(score_matrix(test(j,1),neibor(i))-aver_score);
sum2 = sum2+Sim_matrix(test(j,2),neibor(i));
end
if sum2==0
Predict_score(j,1)=round(aver_score); %排除分母为零的情况
else
Predict_score(j,1)=round(aver_score+sum1/sum2);
%确保预测值为1~5的评分数
if Predict_score(j,1)>5
Predict_score(j,1)=5;
elseif Predict_score(j,1)<1
Predict_score(j,1)=1;
end
end
end
%% 计算RMSE
Eval=zeros(m,3);
Eval(:,1)=test(:,3);
Eval(:,2)=Predict_score(:,1);
Eval(:,3)=abs(test(:,3)-Predict_score(:,1));
RMSE=sqrt(Eval(:,3)'*Eval(:,3)/m);
没有合适的资源?快使用搜索试试~ 我知道了~
基于matlab实现项目的协同过滤算法
共4个文件
m:2个
test:1个
base:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 111 浏览量
2024-05-04
21:22:47
上传
评论
收藏 564KB RAR 举报
温馨提示
基于matlab实现项目的协同过滤算法,可学会如何处理movielens数据集,绝对可用。
资源推荐
资源详情
资源评论
收起资源包目录
基于matlab实现项目的协同过滤算法,可学会如何处理movielens数据集,绝对可用。博客地址httpwww.cnblogs.comhxsylp4456757.html.rar (4个子文件)
matlab实现ItemBaseCF算法
u11.test 383KB
Similarity_ab.m 1KB
testRead.m 3KB
u1.base 1.51MB
共 4 条
- 1
资源评论
- weixin_722719962024-05-18非常有用的资源,可以直接使用,对我很有用,果断支持!
依然风yrlf
- 粉丝: 891
- 资源: 3118
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功