matlab练习_基于用户的协同过滤过滤算法
参考博文链接:【毕业设计算法推荐】基于物品的协同过滤推荐算法(ItemCF)_普通网友的博客-CSDN博客_java基于物品的协同过滤算法
首先,随机生成一些用户行为列表,代码如下:
%%生成用户行为矩阵
function User_Behavior_Matrix = Generate_User_Behavior(user_count, item_count, behavior_sum)
%创建一个介于1到user_count的伪随机整数矩阵(behavior_sum行,1列)
A = randi(user_count, behavior_sum, 1);
B = randi(item_count, behavior_sum, 1);
%定义用户行为种类
behavior_type = [1, 3, 5, 10];
%以相应概率生成用户行为,这里(点击 = 0.4,搜索 = 0.3,收藏 = 0.2,付款 = 0.1)
C = rand(behavior_sum, 1);
for i = 1:behavior_sum
if C(i, 1) <= 0.4
C(i, 1) = behavior_type(1,1);
elseif C(i, 1) <= 0.7
C(i, 1) = behavior_type(1,2);
elseif C(i, 1) <= 0.9
C(i, 1) = behavior_type(1,3);
else
C(i, 1) = behavior_type(1,4);
end
end
User_Behavior_Matrix = [A B C];
%%初始化
clc;
close all;
clear;
%%定义用户行为与权重
% dianji = 1;
% sousu = 3;
% shoucang = 5;
% fukuan = 10;
%%定义用户行为列表
X = [1 1 1;
3 3 5;
2 2 3;
2 5 3;
2 6 5;
1 2 10;
3 3 10;
3 4 5;
3 1 5;
1 1 1;
1 6 5;
1 4 3];
%参考资料
% clc;clear;
% x=[1,2,3,3,4,3,5,6,6,7,8];
% tbl = tabulate(x);%返回三列数组,第一列为数值,第二列为重复次数
% Index=find(tbl(:,2)>1);
%%获取矩阵相关尺寸
item_information = tabulate(X(:, 2));
item_list = item_information(:,1);
item_size = size(item_list, 1);
user_information = tabulate(X(:, 1));
user_list = user_information(:,1);
user_size = size(user_list, 1);
%%根据用户行为列表计算用户,物品的评分矩阵
Y = zeros(item_size, user_size);
[m, n] = size(X);
jifen = zeros(6, 1);
for i = 1:user_size
for j = 1:m
if X(j,1) ~= user_list(i)
continue
else
for k = 1:item_size
if X(j, 2) ~= item_list(k)
continue
else
switch(X(j, 3))
case 1
jifen(k, 1) = jifen(k, 1) + 1;
case 3
jifen(k, 1) = jifen(k, 1) + 3;
case 5
jifen(k, 1) = jifen(k, 1) + 5;
case 10
jifen(k, 1) = jifen(k, 1) + 10;
otherwise
jifen(k, 1) = jifen(k, 1) + 0;
end
end
Y(k, i) = jifen(k, 1);
end
end
end
jifen = zeros(6, 1);
end
step2,3,4
% 获取矩阵的行向量 % a = Scoring_Matrix(1, :)
% 通过size(A)可以得到【m n】
%通过size(A,1)可以得到行数m
%通过size(A,2)可以得到列数n
%Scoring_Matrix = [2 0 5; 10 3 0; 0 0 15; 3 0 5; 0 3 0; 5 5 0];
%%初始化
clc;close all;clear;
load Scoring_Matrix;
%%根据物品的评分矩阵计算物品与物品的相似度
n = size(Scoring_Matrix, 1);
A = zeros(n, n);
for i = 1:n
for j = 1:n
fenzi = dot(Scoring_Matrix(i, :), Scoring_Matrix(j, :));
fenmu = sqrt(dot(Scoring_Matrix(i, :), Scoring_Matrix(i, :))) * ...
sqrt(dot(Scoring_Matrix(j, :), Scoring_Matrix(j, :)));
A(i, j) = fenzi /fenmu;
end
end
%%相似度矩阵 * 评分矩阵 = 推荐矩阵
Recommendation_Matrix = A * Scoring_Matrix;
%%对比评分矩阵,对于已经推荐过的物品进行过滤推荐
%过滤推荐就是置为0,并且选出评分最高的物品,该物品就是应该
%推荐给用户的一个物品
[m, n] = size(Scoring_Matrix);
Result_Matrix = Recommendation_Matrix;
for i = 1:m
for j = 1:n
if Scoring_Matrix(i, j) ~= 0 && Recommendation_Matrix(i, j) ~= 0
Result_Matrix(i, j) = 0;
elseif Scoring_Matrix(i, j) == 0 && Recommendation_Matrix(i, j) ~= 0
Result_Matrix(i, j) = Recommendation_Matrix(i, j);
end
end
end
%%获取最大相似度,并输出推荐列表
[max_a, index] = max(Result_Matrix, [], 1);
%fprintf函数,功能:输出字面文本和数组值
fprintf('用户\t推荐项目\n')
for i = 1: size(Result_Matrix, 2)
fprintf('用户%d \t 项目%d\n', i, index(i))
end