%% 载入训练数据
load u1.base;
%% 数据预处理
% 提取数据的前三列,即用户序号、被该用户评价电影序号、评价分值
[m,n]=size(u1);
test=zeros(m,3);
for a=1:3
test(:,a)=u1(:,a);
end
%% 建立评分矩阵
number_user=max(test(:,1));
number_movies=max(test(:,2));
score_matrix=zeros(number_user,number_movies);%评分矩阵
for a=1:m
score_matrix(test(a,1),test(a,2))=test(a,3);
end
Sim_matrix=zeros(number_user,number_user);%相似度矩阵
tic;
load('SimilitudUsers.mat');
% % 计算评分矩阵
% for a=1:number_user-1
% for b=a+1:number_user
% Sim_matrix(a,b)=Similarity_ab(score_matrix,a,b);
% end
% end
toc;
%% 建立相似度矩阵
% Sim_matrix=Sim_matrix'+Sim_matrix;%求完整的相似度矩阵,就是形成对称矩阵
% 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 u1.test;
%% 作预测
[m,n]=size(u1);
test=zeros(m,3);
for a=1:3
test(:,a)=u1(:,a);
end
Predict_score=zeros(m,1);
for g=1:m
%score_matrix来自于训练集
P_u=find(score_matrix(:,test(g,2))~=0);%找出对电影评价过的所有用户集合
P_u= P_u';
[~,num]=size(P_u);%计算评价过该电影的用户的个数
%%%%%%%%%%%计算邻居%%%%%%%%%%%%
neibor_num=10;
P_u_sim=Sim_matrix(test(g,1),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_g=sum(score_matrix(test(g,1),:),2);%该用户对所有电影的总评分
[~,num1]=size(find(score_matrix(test(g,1),:)));
aver_score_g=sum_score_g/num1;%该用户对电影的平均评分
for e=1:neibor_num
sum_score_e=sum(score_matrix(neibor(e),:),2);%该用户对所有电影的总评分
[~,num2]=size(find(score_matrix(neibor(e),:)));
aver_score_e=sum_score_e/num2;%该用户对电影的平均评分
sum1=0;
sum2=0;
sum1 = sum1+Sim_matrix(test(g,1),neibor(e))*(score_matrix(neibor(e),test(g,2))-aver_score_e);
sum2 = sum2+Sim_matrix(test(g,1),neibor(e));
end
if sum2==0
Predict_score(g,1)=round(aver_score_g); %排除分母为零的情况
else
Predict_score(g,1)=round(aver_score_g+sum1/sum2);
%确保预测值为1~5的评分数
if Predict_score(g,1)>5
Predict_score(g,1)=5;
elseif Predict_score(g,1)<1
Predict_score(g,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)
MSE=sum(Eval(:,3))/m
% save SimilitudItems Sim_matrix;
% load('SimilitudItems.mat');
- 1
- 2
- 3
前往页