%% 载入训练数据
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);
IT狂飙
- 粉丝: 4812
- 资源: 2655
最新资源
- C#全自动多线程上位机源码编程 0,纯源代码 1,替代传统plc搭载的触摸屏 2,工控屏幕一体机直接和plc通信 3,功能
- 基于三有源桥的模型预测控制仿真,可以独立控制输出侧两个端口的电压或者电流,动态响应快,也可以扩展至四有源桥电路
- VIENNA维也纳拓扑,三相整流simulink仿真:采用电压电流双闭环控制,电压外环采用PI控制,电流内环采用bang ban
- 永磁同步电机改进超螺旋滑模观测器无位置传感器控制 采用一种改进的超螺旋滑模观测器永磁同步电机无位置传感器控制,该观测器在传统ST
- comsol仿真模拟气液两相化学吸收CO2(氢氧化钠溶液NaOH和MEA溶液吸收CO2) 此案例为文献复现
- 内有cpar文件和simulink文件,并有演示操作视频,carsim+simulink联合仿真实实现道超车, 包含道决策,路径
- Comsol锂枝晶 相场法构建锂枝晶模型,单枝晶,多枝晶定向生长,三种物理场耦合,相场,浓度,电势? 拿到手就能用,适合新手入门
- matlab simulink三相四桥臂逆变器仿真模型 采用的是电压外环电流内环控制策略,交流测可以接不平衡负载,在负载不平衡的
- OPC配置服务端DCOM 一键配置 DCOM 一键搞定OPC远程通讯问题 省掉手动配置繁琐 OPC DCOM一键
- 西门子S7-1500暖通空调制药厂洁净空调PLC程序案例,硬件采用西门子1500CPU+ET200SP接口IO模块,HMI采用西
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈