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