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

在当今信息爆炸的时代,电影作为人们生活中不可或缺的娱乐方式,受到了越来越多的关注。

由Kaizong Ye,Colin Ge撰写

而为了让观众能够更好地选择适合自己口味的电影,推荐系统成为了一个备受关注的研究领域。


协同过滤算法是其中一种被广泛使用的方法。

本文将以MovieLens数据集为基础,帮助客户分析MATLAB模糊C均值聚类改进的协同过滤算法在推荐系统中的应用。

针对MovieLens数据集进行实验,并比较传统协同过滤算法和改进后的模糊C均值聚类协同过滤算法的性能差异。最后结合实验结果进行分析和总结。

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

  • 模糊C均值聚类(FCM)是一种基于隶属度的聚类方法,它将每个数据点对应到各个聚类中心的隶属度上。

视频

KMEANS均值聚类和层次聚类:R语言分析生活幸福质量系数可视化实例

探索见解

去bilibili观看

探索更多视频

  • 协同过滤算法是一种推荐系统算法,主要用于预测用户对未评价物品的喜欢程度。该算法基于相似性进行推荐,即根据用户行为历史信息来发现不同用户之间的相似性,并根据这些相似性为用户推荐物品。

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

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

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

  • 在使用模糊C均值聚类时,需要选择合适的参数来控制隶属度和聚类个数等因素。这需要根据具体情况进行调整。本文使用了4个聚类有效性函数值来选取最优聚类数。

在计算相似度时,需要选择合适的距离或者相似性度量方法。同时还要考虑如何处理缺失数据、异常值等问题。

数据

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

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

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

过程与结果分析

(1)确定最佳聚类数

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


python机器学习:推荐系统实现(以矩阵分解来协同过滤)

阅读文章


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

image.png

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


随时关注您喜欢的主题


类似的,图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

判别函数VPEVXBVFCVK
Movielens数据集cmax>25cmax=12cmax>25cmax=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

图不同算法召回率的比较

1111.png

在图中,横轴代表推荐列表长度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


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds