全文链接: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%。
名称 | 描述 | 简介 | 每个用户至少评分物品 |
MovieLens | 对电影的评分从1到5 | 943名用户对1682部电影的评价 | 100 |
评分预测的预测准确度一般通过平均绝对误差 (MAE) 计算,平均绝对偏差越小,预测的准确度越高。
过程与结果分析
(1)确定最佳聚类数
首先,通过比较不同聚类数相应的聚类有效性函数值来选出最佳聚类数cmax。实验结果如图所示。
图中的横坐标为聚类数,纵坐标为相应的4个聚类有效性函数值。由上述结果可知,在2到的最佳搜索范围中,不同的聚类数c得到的VPE值与VFC值呈单调趋势,而VXB与VK函数值均在c=12时单调性发生改变。
图1 MovieLens不同聚类数对应的聚类有效性函数值
点击标题查阅往期内容
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
图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
实验结果如图所示。
图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