【机器学习】Matlab_推荐系统协同过滤算法
写在前面:本文根据自己数据挖掘的课程作业整理,结合吴恩达机器学习的课程。
吴恩达课程课件中关于协同过滤算法的总结:
根据上述算法总结,使用Matlab,可以实现上述算法。
测试用到的数据是我的作业中的数据:
该算法实现起来不难,我使用的是最基本的Gradient Descent(当然可以使用其他更加高级的方法),那么代码主要就在于Gradient Descent的实现。
另外,初始化参数一定要记得随机初始化。
完整的Matlab代码如下,各个步骤注释均有说明:
clear;
%% Input useful parameters
% 电影特征维数
m= 4;
% 用户数
nu= 8;
% 电影数
nm= 7;
Y= [4,4,-1,-1,1,1,5,-1;5,5,-1,1,-1,-1,-1,-1;-1,4,1,-1,-1,1,5,4;5,-1,2,5,-1,1,2,-1;1,-1,5,4,5,-1,-1,1;1,-1,5,-1,-1,4,-1,-1;-1,1,-1,5,-1,5,1,-1];
R= ones(nm, nu);
index= find(Y== -1);
R(index)= 0;
% 正则化参数
lambda= 0.1;
% 学习率
alpha= 0.01;
%% Initialize
% Random
X = randn(nm, m);
Theta = randn(nu, m);
% Not random which can't get right result
% c= 3;
% X = c* ones(nm, m);
% Theta = c* ones(nu, m);
%% Gradient Descent
J = 0;
X_grad = zeros(size(X));
Theta_grad = zeros(size(Theta));
num_iter= 50000;
for k= 1:num_iter
predict=(X*Theta') .* R;
J=1/2*sum(sum((predict-Y) .^ 2))+lambda/2*sum(sum(Theta .^ 2))+lambda/2*sum(sum(X .^ 2));
fprintf('J= %d\n', J);
for i= 1:nm
idx= find(R(i,:)==1);
thetatemp= Theta(idx,:);
Ytemp= Y(i, idx);
X_grad(i,:)= (X(i,:)*thetatemp'- Ytemp)* thetatemp+ lambda* X(i, :);
%X(i,:)= X(i,:)- alpha* X_grad(i,:);
end
X= X-alpha* X_grad;
for i= 1:nu
idx= find(R(:,i)== 1);
Xtemp= X(idx,:);
Ytemp= Y(idx,i);
Theta_grad(i,:)=(Xtemp*Theta(i,:)'-Ytemp)'*Xtemp+lambda*Theta(i,:);
%Theta(i,:)= Theta(i,:)- alpha* Theta_grad(i,:);
end
Theta= Theta-alpha*Theta_grad;
end
%% predict
Y_pred= X* Theta';
%% calculate the square error
idx= find(R== 1);
s_error_mat= (Y_pred- Y).^2;
s_error= sum(s_error_mat(idx));
%% Code for calculate similarity
% msimi= zeros(7, 1);
% for i= 1:7
% msimi(i)= norm(X(i,:)- X(1,:));
% end
% msimi= zeros(7, 1);
% for i= 1:7
% msimi(i)= norm(X(i,:)- X(5,:));
% end