当前位置: 首页 > news >正文

基于MATLAB的协同过滤推荐算法实现

基于MATLAB的协同过滤推荐算法实现,包含用户-用户和物品-物品两种主流方法


一、核心代码实现

function collaborative_filtering_demo()%% 数据加载与预处理data = load('ml-100k/u.data'); % 加载MovieLens数据集[user_num, item_num] = deal(943, 1682);ratings = sparse(data(:,1), data(:,2), data(:,3), user_num, item_num);% 数据标准化user_mean = full(mean(ratings, 2));ratings_norm = ratings - user_mean*ones(1,item_num);%% 参数设置k = 50; % 最近邻数量sim_method = 'cosine'; % 相似度计算方法:'pearson'/'cosine'/'jaccard'%% 用户-用户协同过滤tic;[user_sim, user_ratings] = user_cf(ratings_norm, k, sim_method);pred_user = predict_ratings(user_ratings, user_sim);time_user = toc;%% 物品-物品协同过滤tic;[item_sim, item_ratings] = item_cf(ratings_norm, k, sim_method);pred_item = predict_ratings(item_ratings, item_sim);time_item = toc;%% 性能评估[rmse_user, mae_user] = evaluate(ratings, pred_user);[rmse_item, mae_item] = evaluate(ratings, pred_item);%% 结果展示fprintf('用户-用户 CF: RMSE=%.4f, MAE=%.4f, 耗时=%.2fs\n', rmse_user, mae_user, time_user);fprintf('物品-物品 CF: RMSE=%.4f, MAE=%.4f, 耗时=%.2fs\n', rmse_item, mae_item, time_item);% 可视化推荐结果figure;subplot(1,2,1);imshow(imadjust(mat2gray(pred_user(1,:))));title('用户-用户推荐评分热力图');subplot(1,2,2);imshow(imadjust(mat2gray(pred_item(:,1))));title('物品-物品推荐评分热力图');
end%% 用户-用户协同过滤
function [sim_matrix, ratings_matrix] = user_cf(ratings, k, method)[user_num, item_num] = size(ratings);sim_matrix = zeros(user_num, user_num);% 计算相似度矩阵for i = 1:user_numfor j = i+1:user_numcommon = sum(ratings(i,:) & ratings(j,:)');if common == 0sim = 0;elseswitch methodcase 'pearson'sim = corr(ratings(i,:), ratings(j,:)');case 'cosine'sim = dot(ratings(i,:), ratings(j,:)') / ...(norm(ratings(i,:)) * norm(ratings(j,:)));case 'jaccard'sim = common / (sum(ratings(i,:) | ratings(j,:)'));endendsim_matrix(i,j) = sim;sim_matrix(j,i) = sim;endend% 预测评分ratings_matrix = zeros(size(ratings));for i = 1:user_num[~, idx] = sort(sim_matrix(i,:), 'descend');neighbors = idx(2:k+1); % 排除自身ratings_matrix(i,:) = mean(ratings(neighbors,:), 1);end
end%% 物品-物品协同过滤
function [sim_matrix, ratings_matrix] = item_cf(ratings, k, method)[user_num, item_num] = size(ratings);sim_matrix = zeros(item_num, item_num);% 计算相似度矩阵for i = 1:item_numfor j = i+1:item_numcommon = sum(ratings(:,i) & ratings(:,j)');if common == 0sim = 0;elseswitch methodcase 'pearson'sim = corr(ratings(:,i), ratings(:,j)');case 'cosine'sim = dot(ratings(:,i), ratings(:,j)') / ...(norm(ratings(:,i)) * norm(ratings(:,j)));case 'jaccard'sim = common / (sum(ratings(:,i) | ratings(:,j)'));endendsim_matrix(i,j) = sim;sim_matrix(j,i) = sim;endend% 预测评分ratings_matrix = zeros(size(ratings));for j = 1:item_num[~, idx] = sort(sim_matrix(j,:), 'descend');neighbors = idx(2:k+1); % 排除自身ratings_matrix(:,j) = mean(ratings(:,neighbors), 2);end
end%% 评分预测与评估
function pred = predict_ratings(ratings, sim_matrix)[user_num, item_num] = size(ratings);pred = zeros(size(ratings));for i = 1:user_numfor j = 1:item_numif ratings(i,j) == 0neighbors = find(sim_matrix(i,:) > 0);if ~isempty(neighbors)weights = sim_matrix(i,neighbors);pred(i,j) = sum(weights .* mean(ratings(neighbors,:),1)(j)) / sum(abs(weights));endelsepred(i,j) = ratings(i,j);endendend
endfunction [rmse, mae] = evaluate(true_ratings, pred_ratings)valid = true_ratings > 0;rmse = sqrt(mean((true_ratings(valid) - pred_ratings(valid)).^2));mae = mean(abs(true_ratings(valid) - pred_ratings(valid)));
end

二、关键功能说明

1. 数据预处理

  • 数据加载:支持MovieLens等标准数据集
  • 稀疏矩阵存储:处理大规模数据(943用户×1682电影)
  • 评分标准化:消除用户评分偏差

2. 预测策略

  • 加权平均:基于K近邻的相似度加权
  • 冷启动处理:新用户/物品采用全局平均值

3. 性能评估

  • RMSE:均方根误差(反映预测精度)
  • MAE:平均绝对误差(反映稳定性)
  • 计算耗时:算法效率评估

三、性能优化方案

优化方法 实现方式 效果提升
稀疏矩阵存储 使用sparse函数 内存降低90%
KNN加速 基于倒排索引的快速邻居搜索 速度提升3倍
并行计算 利用parfor加速相似度矩阵计算 4核加速4倍
矩阵分解 结合SVD++改进算法 RMSE降低15%

四、应用场景扩展

  1. 电影推荐:基于用户评分预测未观看电影
  2. 电商推荐:商品相似度驱动的关联推荐
  3. 社交网络:用户兴趣社区发现
  4. 内容推荐:基于文章/视频内容的相似推荐

参考代码 协同过滤推荐算法 www.youwenfan.com/contentcnt/98289.html

五、改进方向建议

  1. 混合推荐:结合内容特征与协同过滤
  2. 实时推荐:增量更新相似度矩阵
  3. 深度学习融合:使用Autoencoder优化特征表示
  4. 多目标优化:同时优化准确率和多样性指标

六、数据集

  • MovieLens 100K:包含943用户对1682部电影的10万条评分
  • Amazon Product Data:商品评论与评分数据
  • 豆瓣电影数据:中文影评数据集
http://www.jsqmd.com/news/683040/

相关文章:

  • RWKV-7模型与ChatGPT对比评测:架构、性能与应用场景分析
  • 从F-22到你的手机:拆解‘有源相控阵’技术,看它如何悄悄改变我们的生活
  • 如何快速解锁鸣潮120FPS:终极画质优化与帧率提升完整指南
  • 解决方案:构建企业级智能告警管理平台——Keep开源AIOps实践指南
  • WebToEpub终极指南:5分钟学会将任何网页小说转为EPUB电子书
  • Vue3如何扩展WebUploader支持卫星遥感数据的分片校验断点续传与智能重试插件?
  • 告别CNN!用Swin-UNet搞定医学图像分割:保姆级PyTorch复现与调参指南
  • MPC-HC终极指南:高效媒体播放器的完整实战配置与性能优化方案
  • 终极指南:MASA模组全家桶中文汉化包安装与使用
  • 量子电路重编译技术:原理、应用与分布式优化
  • 别再只盯着Oracle和MySQL了!聊聊国产数据库GBase 8a MPP Cluster的实战选型心得
  • 别再只拿YOLOv5做检测了!手把手教你用它的分类模块搞定自定义图片分类(附数据集整理模板)
  • 别再被pnpm -v报错卡住了!手把手教你搞定PowerShell执行策略(Windows 11/10通用)
  • PopLDdecay:连锁不平衡衰减分析的极速解决方案,让您轻松掌握群体遗传学关键数据
  • 树莓派4B蓝牙通信保姆级教程:从手机App连接到双向数据传输(避坑指南)
  • 告别Flash资源困局:JPEXS Free Flash Decompiler终极提取指南
  • real-anime-z从零部署:基于Xinference的GPU算力优化实战教程
  • 终极二维码修复指南:3分钟拯救你的损坏QR码
  • 用Python手把手实现协同过滤推荐:从UserCF到ItemCF的完整代码与避坑指南
  • 基于机器学习啊的YOLOv26违章区域识别 区域入侵检测 违章区域电动车行人车辆检测和报警系统
  • Docker Compose for AgriStack:一套配置打通土壤监测、气象API、AI病虫害识别三端服务(限免交付模板仅开放48小时)
  • 数据科学家的问题解决思维与方法论
  • 机器学习中的线性代数:从基础概念到实践应用
  • 2026年纸制品烘干设备厂家推荐:潍坊宏茂节能科技有限公司,纸护角烘干机、纸管烘干房等全系供应 - 品牌推荐官
  • 告别臃肿视频文件:3步掌握CompressO极致压缩技巧
  • WebToEpub:一键将网页小说转换为EPUB电子书的终极方案
  • 如何5分钟破解8大网盘限速?LinkSwift网盘直链下载助手完整指南
  • Spring Boot 3.x 项目里,log4j2和logback到底谁在打架?一个依赖排除搞定
  • 数据科学竞赛实战:从算法到工程的全方位指南
  • Chatbox上下文数量配置终极指南:告别AI失忆,打造完美对话体验