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

相关文章
|
25天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
50 4
|
8天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
算法 数据挖掘
基于粒子群优化算法的图象聚类识别matlab仿真
该程序基于粒子群优化(PSO)算法实现图像聚类识别,能识别0~9的数字图片。在MATLAB2017B环境下运行,通过特征提取、PSO优化找到最佳聚类中心,提高识别准确性。PSO模拟鸟群捕食行为,通过粒子间的协作优化搜索过程。程序包括图片读取、特征提取、聚类分析及结果展示等步骤,实现了高效的图像识别。
|
15天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
21天前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
50 4
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
34 1
|
2月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
104 19
|
28天前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
30 0
|
2月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
43 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计