a.txt
2,8,3.0 2,26,4.0 2,27,4.0 2,35,4.0 2,42,3.0 2,66,5.0 2,67,2.0 2,69,4.0 2,85,3.0 2,101,5.0 2,108,4.0 2,113,3.0 2,117,5.0 4,145,2.0 5,152,5.0 5,4,5.0 6,75,5.0 7,181,5.0
dataset.m
function[B]=dataset(A) for i=1:10000
B(A(i,1),A(i,2))=A(i,3); end
process.m
load Netflix.mat; [t1,t2]=size(B); user_sim=[]; for i=1:t1-1 for j=i+1:t1
user_sim(i,j)=simliarity(B,i,j); user_sim(j,i)=user_sim(i,j);
end end
num_predict=0;
number=[30];%[10 20 30 40 50 60 70 80]; pre_rating=0;
for p=1:length(number) sum_erro=0; MAE=0; RMSE=0;
sum_RMSE_erro=0; load('testRating.txt'); for i=1:length(testRating)
pre_rating=predict(B,user_sim,testRating(i,1),testRating(i,2),nu
mber(p));
if (pre_rating~=0)
num_predict=num_predict+1; end
sum_erro=sum_erro+abs(pre_rating-testRating(i,3));
sum_RMSE_erro=sum_RMSE_erro+(pre_rating-testRating(i,3))^2;
if testRating(i,2)==8 testRating(i,1) testRating(i,2) testRating(i,3) pre_rating end end
fprintf(' CF 邻居个数等于30 的平均预测误差是:\\n\\n'); MAE=sum_erro/num_predict
RMSE=sqrt(sum_RMSE_erro/num_predict) coverage=num_predict/length(testRating) end
simliarity.m
function [sim]=simliarity(B,tar_user_id,pre_user_id) [t1,t2]=size(B);
co_rating_number=0; co_item=[]; sum_tar_user=0; sum_pre_user=0; avg_tar_user=0; avg_pre_user=0; for j=1:t2
if (B(tar_user_id,j)~=0) && (B(pre_user_id,j)~=0) co_rating_number=co_rating_number+1; sum_tar_user=sum_tar_user+B(tar_user_id,j); sum_pre_user=sum_pre_user+B(pre_user_id,j); co_item(1,co_rating_number)=j; end end
if (co_rating_number==0) sim=0; else
avg_tar_user=sum_tar_user/co_rating_number; avg_pre_user=sum_pre_user/co_rating_number; numerator=0;%分子 denominator1=0; denominator2=0;
denominator=0;%分母 for i=1:co_rating_number item_id=co_item(1,i);
1
numerator=numerator+(B(tar_user_id,item_id)-avg_tar_user)*(B(pre_user_id,item_id)-avg_pre_user);
denominator1=denominator1+(B(tar_user_id,item_id)-avg_tar_user)^2;
denominator2=denominator2+(B(pre_user_id,item_id)-avg_preelse
avg_tar=sum_tar/num_tar; end
for i=1:num_neib
%计算预测用户的平均评分 pre_use_id=users(i,1); _user)^2; end
denominator=sqrt(denominator1)*sqrt(denominator2); if (denominator==0) sim=0; else
sim=numerator/denominator; end end
predict.m
function [ pre_rating ] predict( B,user_sim,tar_user_id,tar_item_id,nu ) %首先,找出对目标项目有过评分的用户users [t1,t2]=size(B); n=0; users=[]; for i=1:t1
if (B(i,tar_item_id)~=0) && (i~=tar_user_id) n=n+1;
users(n,1)=i;
users(n,2)=user_sim(i,tar_user_id); end end
users=sort_weight(users);
num_neib=nu;%设置邻居个数 if num_neib>n num_neib=n; end %预测
numerator=0;%分子 denominator=0;%分母
%计算目标用户的平均评分 sum_tar=0; num_tar=0; avg_tar=0; for j=1:t2
if B(tar_user_id,j)~=0 num_tar=num_tar+1;
sum_tar=sum_tar+B(tar_user_id,j); end end
if num_tar==0 avg_tar=0;
sum_pre=0; num_pre=0; avg_pre=0; for j=1:t2
if B(pre_use_id,j)~=0
num_pre=num_pre+1;
sum_pre=sum_pre+B(pre_use_id,j); end end
if num_pre==0 =
avg_pre=0; else
avg_pre=sum_pre/num_pre; end
numerator=numerator+users(i,2)*(B(pre_use_id,tar_item_id)-avg_pre);
denominator=denominator+abs(users(i,2)); end
if denominator==0 pre_rating=0; else
pre_rating=avg_tar+numerator/denominator; end
2