MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集

简介: MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集

全文链接:http://tecdat.cn/?p=32594


在当今信息爆炸的时代,电影作为人们生活中不可或缺的娱乐方式,受到了越来越多的关注点击文末“阅读原文”获取完整代码数据


而为了让观众能够更好地选择适合自己口味的电影,推荐系统成为了一个备受关注的研究领域。协同过滤算法是其中一种被广泛使用的方法。

本文将以MovieLens数据集为基础,帮助客户分析MATLAB模糊C均值聚类改进的协同过滤算法在推荐系统中的应用。针对MovieLens数据集进行实验,并比较传统协同过滤算法和改进后的模糊C均值聚类协同过滤算法的性能差异。最后结合实验结果进行分析和总结。

1. 首先需要了解什么是模糊C均值聚类和协同过滤算法。

  • 模糊C均值聚类(FCM)是一种基于隶属度的聚类方法,它将每个数据点对应到各个聚类中心的隶属度上。
  • 协同过滤算法是一种推荐系统算法,主要用于预测用户对未评价物品的喜欢程度。该算法基于相似性进行推荐,即根据用户行为历史信息来发现不同用户之间的相似性,并根据这些相似性为用户推荐物品。

2. 然后需要了解如何将这两种算法结合起来实现数据分析。

  • 在协同过滤算法中,我们需要计算不同用户之间或者不同物品之间的相似度。而这里可以使用模糊C均值聚类来实现。
  • 具体地说,在MovieLens数据集中,我们可以将每一个电影看作是一个向量,其中包括电影名称、导演、演员、类型等特征。然后使用模糊C均值聚类将这些电影聚类到不同的簇中。
  • 接着,我们可以计算用户和簇之间的相似度,进而推荐给用户可能感兴趣的电影。

3. 最后需要注意哪些细节问题。

  • 在使用模糊C均值聚类时,需要选择合适的参数来控制隶属度和聚类个数等因素。这需要根据具体情况进行调整。本文使用了4个聚类有效性函数值来选取最优聚类数。
  • 在计算相似度时,需要选择合适的距离或者相似性度量方法。同时还要考虑如何处理缺失数据、异常值等问题。


数据


MovieLens数据是美国Minnesota大学GroupLens项目组提供的Movielens数据集ml-100k中的u2数据。这个数据集包含了943名用户对1682部电影的评价(评分值为数字1到5,若数值越高则用户喜爱该电影的程度越高),并含有电影项目的分类特征。该数据集仅包含了评价过20部以上电影的用户评价数据,没有评分的电影数据占所有数据的比重(稀疏度)为94%。

image.png

名称 描述 简介 每个用户至少评分物品
MovieLens 对电影的评分从1到5 943名用户对1682部电影的评价 100

评分预测的预测准确度一般通过平均绝对误差 (MAE) 计算,平均绝对偏差越小,预测的准确度越高。

 

过程与结果分析


(1)确定最佳聚类数

首先,通过比较不同聚类数相应的聚类有效性函数值来选出最佳聚类数cmax。实验结果如图所示。

图中的横坐标为聚类数,纵坐标为相应的4个聚类有效性函数值。由上述结果可知,在2到的最佳搜索范围中,不同的聚类数c得到的VPE值与VFC值呈单调趋势,而VXB与VK函数值均在c=12时单调性发生改变。

image.png

图1  MovieLens不同聚类数对应的聚类有效性函数值


点击标题查阅往期内容


python推荐系统实现(矩阵分解来协同过滤)


01

02

03

04


类似的,图1中的横坐标为聚类数,纵坐标为相应的4个聚类有效性函数值。由上述结果可知,在2到的最佳搜索范围中,不同的聚类数c得到的VPE值与VFC值呈单调趋势,而VXB与VK函数值均在c=12时单调性发生改变。

最后得到不同判别函数在不同数据集上的指标值如表1所示。

%XB 用Xie和Beni的准则来求最优聚类数
%   u为隶属度矩阵,center为聚类中心矩阵
V=0;
for i=1:size(u,1)
    for j=1:size(u,2)
    V=V+(u(i,j))^2*(norm(data(j,:)-center(i,:)))^2;    
    end
end
fenmu=(min(pdist(center,'euclidean')))^2;

表1 Xie-Beni方法确定的最佳聚类数cmax

判别函数 VPE VXB VFC VK
Movielens数据集 cmax>25 cmax=12 cmax>25 cmax=12

因此,根据Xie-Beni方法,本文选取Flixster数据集的最佳聚类数cmax为10,本文选取MovieLens数据集的最佳聚类数cmax为12。

(2)MAE指标比较

模糊C均值聚类算法的关键步骤是确定最佳聚类簇数,为检验本节给出的FCMC CF算法,我们在Movielens和Flixster数据集上进行了实验分析,并将其同K-means、K-medoids和K-mode聚类协同过滤算法进行了比较,实验结果如图所示。

%FCMC data为模糊C均值聚类的实验数据,top代表XB准则下的前10个最佳聚类数,b为该10个最佳聚类数的PE指标值
%  
for k=2:sqrt(size(data,1))
    [center u]=fcm(data,k);
    Vpe(k-1)=Bezdek(u);
    Vxb(k-1)=XB(u,center,data);
    Vfs(k-1)=FS( u,center,data);
    Vk(k-1)=Kwon( u,center,data);
end
k=2:sqrt(size(data,1));
    subplot(2,2,1),plot(k,Vpe(k-1),'- *'),xlabel('x(聚类簇数)'),ylabel('y(Vpe指标)')
k=2:sqrt(size(data,1));
subplot(2,2,2),plot(k,Vxb(k-1),'- or'),xlabel('x(聚类簇数)'),ylabel('y(Vxb指标)')
 
k=2:sqrt(size(data,1));
subplot(2,2,3),plot(k,Vfs(k-1),'- or'),xlabel('x(聚类簇数)'),ylabel('y(Vfs指标)')
k=2:sqrt(size(data,1));
Predict(i,j,D,data,itemN)
%j代表目标用户,i为j用户的邻居用户为i用户集,data为用户-物品矩阵,D为相似系数矩阵,item为用户j要预测的物品编号
tempu= find(data(j,:)~=0);%发现用户所有已评分的项目
Ru=mean(data(j,tempu));%计算用户评分的平均值
a=length(i);
fenzi=0;
for k=1:a
tempv=find(data(i(k),:)~=0);
Rv=mean(data(i(k),tempv));
fenzi=fenzi+D(j,i(k)).*(data(i(k),itemN)-Rv);
end
fenmu=0;
for k=1:a

image.png

图2 Movielens数据集不同算法MAE的比较

unction mae = MAE(CS,udata,udatatest,Fuz)
%CS为相似度矩阵,data为训练集用户项目矩阵,datatest为测试集用户项目矩阵,Fuz为标记变量(1为模糊C均值聚类协同过滤,0为传统系统过滤)
j=1;
for n=1:5:80%########最近邻数
mae(j)=0;%mae为最近邻为n的情况下的最小均方误差 
k=0;%计数变量
   for t=1:size(udatatest,1)
    
    i=topn(CS,t,n);%计算出该用户的最近邻用户集合,t为i目标用户编号,i为相邻用户编号(按相似度从高到低排列),n为n个邻居用户数,应设为?
    item=find(udatatest(t,:)~=0);%item为测试集中用户的评价项目
    if n>length(i)
           continue;

在图中,横轴为最近邻个数 k,纵轴为平均绝对偏差 MAE。曲线CF代表传统的协同过滤算法,曲线Kmean CF代表基于K均值聚类的协同过滤算法,曲线FCMC CF代表基于模糊C均值聚类有效性的协同过滤算法,曲线K medoids CF代表基于K medoids聚类的协同过滤算法。

由图可以看到基于有效性指标改进的FCMC CF算法在MAE指标上要明显优于其他算法。在Movielens数据集上的实验结果表明,FCMC CF得到的MAE值要优于其他几个算法。

(3)召回率和覆盖率的比较

在接下来的TOP-N实验中,我们选择FCMC CF算法与其他算法在召回率、覆盖率指标上进行比较。

%D为相似系数矩阵,i为第i个目标用户,n为前n个最相似的用户数,输出为前n个用户的坐标信息
[a,b]=sort(D(i,:),'descend');%a为从高到低排的相似系数
top=b(1:n);
I= ind2sub(size(D), top);%J目标用户编号,I相邻用户编号(按相似度从高到低排列)
 Recall(udata,udatatest,CS,Fuz)
Recall(udata,udatatest,CS,Fuz)
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
%N为推荐列表的长度,udata为用户项目评分矩阵
j=1;
for N=5:5:50
n=30;%n为目标用户的最近邻居用户数#######默认为3个
for q=1:size(udata,1)%计算每位用户对每个物品的预测评分
    for w=1:size(udata,2)
    I=topn(CS,q,n);%D为相似系数矩阵,i为第i个目标用户(即为q),n为前n个最相似的用户数(默认为3),输出为最近邻居用户的前n个用户的坐标信息
    rank(q,w)=Predict(I,q,CS,udata,w);%rank为用户项目预测评分矩阵,j代表目标用户(即为q),i为j用户的邻居用户为i用户集,data为用户-物品矩阵,D为相似系数矩阵,item为用户j要预测的物品编号(即为w)
    end
end

实验结果如图所示。

image.png

image.png

图4 不同算法召回率的比较

在图中,横轴代表推荐列表长度N,纵轴分别为召回率和覆盖率。其中,每个N值对应的两条曲线图分别为FCMC CF与CF、Kmeans CF对应的函数值。

FCMC CF算法与传统CF算法和Kmeans CF算法相比,在不同的最近邻水平下具有较高的召回率和覆盖率,即新算法在推荐质量上有所改善,有效地提升了推荐精度。

%%预测函数
predictfun2( CS, t,item ,n,udata)
%%其中CS为相似度矩阵
%%item为预测的项目编号
%%t为目标用户
%%n为近邻个数
%%udata为用户-项目评分矩阵
 
%%得到的预测评分为2.24
%%实际评分为3

image.png

相关文章
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
1天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
19 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
2天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。
|
4天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】聚类算法中,如何判断数据是否被“充分”地聚类,以便算法产生有意义的结果?
【5月更文挑战第14天】【机器学习】聚类算法中,如何判断数据是否被“充分”地聚类,以便算法产生有意义的结果?
|
4天前
|
机器学习/深度学习 传感器 算法
【机器学习】在聚类算法中,使用曼哈顿距离和使用欧式距离有什么区别?
【5月更文挑战第12天】【机器学习】在聚类算法中,使用曼哈顿距离和使用欧式距离有什么区别?
|
4天前
|
机器学习/深度学习 算法 数据可视化
【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法
【5月更文挑战第12天】【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法
|
4天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
4天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
9 1
|
4天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】在使用K-means聚类算法时,如何选择K的值?
【5月更文挑战第11天】【机器学习】在使用K-means聚类算法时,如何选择K的值?
|
4天前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。
http://www.vxiaotou.com