质量挖掘算法

该博客介绍了质量挖掘算法在处理N个用户和M个产品评分数据时的应用。通过迭代计算每个产品的quality和用户的reputation,最终达到稳定状态。实验使用MATLAB实现,并基于 Movielens 数据集得出结果,找到最高和最低reputation的用户以及最高和最低quality的电影。该算法展示了迭代思想在数据处理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

质量挖掘算法

 对于N个用户和M个产品,每一名用户都有选择性去给每一个产品进行评分, 定义第 l 个产品的 quality 为 q l q_l ql:

q l = ∑ i = 1 N f i x i l ∑ i = 1 N f i q_l = \frac{\sum_{i=1}^Nf_ix_{il}}{\sum_{i=1}^Nf_i} ql=i=1Nfii=1Nfixil

 定义第 i 个用户的 reputation 为 f i f_i fi

f i = 1 V i f_i = \frac{1}{V_i} fi=Vi1

V i = 1 M ∑ l = 1 M ( x i l − q l ) 2 V_i=\frac{1}{M}\sum_{l=1}^M(x_{il}-q_l)^2 Vi=M1l=1M(xilql)2

 其中 x i l x_{il} xil 表示第 i 个用户给第 l 个产品的评分值,这里为了限制产品的 quality 在 5 以内,分母除以所有用户的 reputation 之和。
 给定用户的初始 reputation,通过循环迭代计算每个产品的 quality 和每 一名用户的 reputation,直到 reputation 和 quality 不再更新。

程序
clear;clc;                                      %清除数据和记录
moviedata = importdata('movielens.txt');        %读入文件
usermin = min(moviedata(:,1));                  %用户最小id
usermax = max(moviedata(:,1));                  %用户最大的id
promin = min(moviedata(:,2));                   %电影最小的id
promax = max(moviedata(:,2));                   %电影最大的id
userlen = usermax-usermin+1;                    %用户数目
prolen = promax-promin+1;                       %电影数目
links = zeros(usermax-usermin+1,promax-promin+1);%初始化用户评分电脑对应矩阵
for i = 1:size(moviedata,1)                     %利用数据计算评分矩阵
    links(moviedata(i,1),moviedata(i,2)) = moviedata(i,3);
end
repu = ones(userlen,1);                         %用户信誉值
lastrepu = repu;                                %上一次repu的值
qual = ones(1,prolen);                          %电影评分值
lastqual = qual;                                %上一次qual的值
indexall = 100000;                              %循环次数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 为了避免无限计算 这里用for循环 
% 将循环次数设置很大 当repu和qual不更新 则退出循环
% 如果用while循环,当repu和qual始终更新时 程序将会一直执行下去
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for index =1:indexall                       %循环计算
    for i = 1:prolen                        %循环计算每部电影的quality
        tt = find(links(:,i)~=0);           %找到评分的用户
        qual(i) = sum(repu(tt,1).*links(tt,i))...
            /(sum(repu(tt,1)));             %计算quality
    end
    
    for i = 1:userlen                       %循环计算每个用户的reputation
        tt = find(links(i,:)~=0);           %找到评分的电影
        repu(i) = 1/(sum((qual(1,tt)-links(i,tt))...
            .^2)/(length(tt)));             %计算reputation
    end
    derepu = sum(lastrepu - repu);          %计算当前时刻与上一时刻的reputation差值
    dequal = sum(lastqual - qual);          %计算当前时刻与上一时刻的quality差值
    if((sum(derepu)+sum(dequal))==0)        %requtation与quality保持不变
        break;                              %退出循环
    else
        lastrepu = repu;                    %保留当前的reputation
        lastqual = qual;                    %保留当前的quality
    end
    disp(['第' num2str(index) '次循环计算']) %输出当前循环次数
end
figure(1)                                   %绘图句柄
plot(1:userlen,repu)                        %绘制用户reputation          
title('用户reputation')                     %添加标题
xlabel('用户id')                            %添加x轴名称
ylabel('reputation')                        %添加y轴名称
figure(2)                                   %绘图句柄
plot(1:prolen,qual)                         %绘制电影quality          
title('电影quality')                        %添加标题
xlabel('电影id')                            %添加x轴名称
ylabel('quality')                           %添加y轴名称
maxrepu = max(repu);                        %reputation最大值
maxrepuid = find(repu == maxrepu );         %reputation最大的用户
maxqual = max(qual);                        %quality最大值
maxqualid = find(qual == maxqual );         %quality最大的电影
disp(['id为:' num2str(maxrepuid) ' 的用户reputation最大,reputation为:' ...
    num2str(maxrepu)])                      %reputation最大的用户
disp(['id为:' num2str(maxqualid) ])                      
disp([' 的电影quality最大,quality为:' ...
    num2str(maxqual)])                      %quality最大的电影

minrepu = min(repu);                        %reputation最小值
minrepuid = find(repu == minrepu );         %reputation最小的用户
minqual = min(qual);                        %quality最小值
minqualid = find(qual == minqual );         %quality最小的电影
disp(['id为:' num2str(minrepuid) ' 的用户reputation最小,reputation为:' ...
    num2str(minrepu)])                      %reputation最小的用户
disp(['id为:' num2str(minqualid) ])                      
disp([' 的电影quality最小,quality为:' ...
    num2str(minqual)])                      %quality最小的电影

实验结果与分析

在这里插入图片描述
  利用 MATLAB 实现质量挖掘,基于 Movielens 数据,得到了每一名用户的 reputation 和每一部电影的 quality,同时找出了 id 为:874 的用户 reputation 最大,reputation 为:3.6673;id 为:814 1122 1189 1201 1293 1467 1500 1536 1599 1653 的电影 quality 最大,quality 为:5;id 为:127 的 用户 reputation 最小,reputation 为:0.25561;id 为:314 437 439 599 784 830 852 858 1308 1309 1320 1325 1329 1334 1339 1340 1341 1343 1348 1349 1352 1354 1359 1363 1364 1366 1373 1374 1408 1432 1486 1493 1494 1546 1548 1557 1559 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1574 1575 1576 1577 1579 1580 1581 1582 1583 1584 1586 1587 1601 1618 1621 1626 1654 1659 1661 1671 1678 的电影 quality 最小,quality 为:1。

  通过利用质量挖掘算法,可以计算用户的 reputation 和产品的 quality 值。 这种算法值得我们学习的是里面的迭代思想,通过迭代,使得结果趋于稳定。

源码
github传送
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuntou0906

玛莎拉蒂是我的目标!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值