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

推荐系统入门(二):协同过滤 —— 让相似的人替你做选择

一句话理解协同过滤
“和你口味差不多的人喜欢这个,那你可能也会喜欢。”
这就是推荐系统的“群体智慧”。

在上一篇《推荐系统入门(一):从“找相似”开始》中,我们学会了用物品特征构建用户画像,实现基于内容的推荐。但这种方法有个明显短板:它只能推荐“已知兴趣圈”里的东西,无法帮你发现新大陆。

比如,你一直看编程视频,系统永远不会想到推荐《数据可视化艺术》或《产品思维课》——哪怕很多程序员其实对这些内容很感兴趣。

怎么办?答案是:别只盯着物品,看看人

这就是今天要讲的核心方法:协同过滤(Collaborative Filtering)

什么是协同过滤?

协同过滤的基本假设非常朴素:

行为相似的用户,兴趣也相似。

举个例子:

  • 用户 A 和用户 B 都给《线性代数》和《Python入门》打了高分;
  • 用户 B 还特别喜欢《机器学习导论》;
  • 那么系统就有理由猜测:用户 A 也可能喜欢《机器学习导论》,即使他还没看过。

这种“借他人之眼识己之所好”的思路,就是协同过滤的魅力所在。它不依赖物品本身的标签或描述,而是纯粹从用户-物品交互行为(如评分、点击、购买)中挖掘模式。

最常见的形式是基于用户的协同过滤(User-Based Collaborative Filtering)

动手实现:用 Python 实现一个协同过滤推荐器

我们继续用一个小而清晰的例子来演示全过程。

假设有4位用户(A、B、C、D)对若干视频进行了评分(1~5分),数据如下:

用户v1v2v3
A53?
B4?5
C?24
D5??

我们的目标是:为用户 A 预测他对 v3 的喜好,并决定是否推荐

第一步:构建用户-物品评分矩阵

importpandasaspdfromsklearn.metrics.pairwiseimportcosine_similarityimportnumpyasnp# 原始评分数据ratings=pd.DataFrame({'User':['A','A','B','B','C','C','D'],'Item':['v1','v2','v1','v3','v2','v3','v1'],'Rating':[5,3,4,5,2,4,5]})# 转为用户-物品矩阵rating_matrix=ratings.pivot(index='User',columns='Item',values='Rating')print("原始评分矩阵:")print(rating_matrix)

输出:

原始评分矩阵: Item v1 v2 v3 User A 5.0 3.0 NaN B 4.0 NaN 5.0 C NaN 2.0 4.0 D 5.0 NaN NaN

第二步:计算用户之间的相似度

我们将缺失值暂时填充为 0(实际工业系统会做更精细处理,如中心化),然后用余弦相似度衡量用户偏好有多接近:

# 简化处理:NaN 填 0rating_matrix_filled=rating_matrix.fillna(0)# 计算用户相似度user_sim=cosine_similarity(rating_matrix_filled)user_sim_df=pd.DataFrame(user_sim,index=rating_matrix.index,columns=rating_matrix.index)print("\n用户相似度矩阵:")print(user_sim_df.round(4))

输出:

用户相似度矩阵: User A B C D User A 1.0000 0.5357 0.2301 0.8575 B 0.5357 1.0000 0.6984 0.6247 C 0.2301 0.6984 1.0000 0.0000 D 0.8575 0.6247 0.0000 1.0000

可以看到:用户 A 和 D 最像(相似度 0.86),因为他们都给了 v1 高分,且都没评其他项;A 和 B 也有一定相似性。

第三步:预测用户 A 对 v3 的评分

v3 目前只有 B 和 C 评过分。我们用他们的评分,按与 A 的相似度加权平均:

target_user='A'items_not_rated=rating_matrix.loc[target_user][rating_matrix.loc[target_user].isna()].index pred_scores={}foriteminitems_not_rated:# 找出评过该物品的其他用户users_who_rated=rating_matrix[item].dropna().indexiflen(users_who_rated)==0:continuesim_scores=[]weighted_ratings=[]foruserinusers_who_rated:ifuser==target_user:continuesim=user_sim_df.loc[target_user,user]rating=rating_matrix.loc[user,item]sim_scores.append(sim)weighted_ratings.append(sim*rating)# 加权平均预测ifsum(sim_scores)>0:pred=sum(weighted_ratings)/sum(sim_scores)else:pred=rating_matrix[item].mean()# 回退到全局平均pred_scores[item]=pred# 排序推荐recommended=sorted(pred_scores.items(),key=lambdax:x[1],reverse=True)print(f"\n为用户{target_user}推荐:")foritem,scoreinrecommended:print(f"{item}: 预测评分 ={score:.2f}")

输出:

为用户 A 推荐: v3: 预测评分 = 4.70

系统认为 A 很可能喜欢 v3(预测分 4.7),值得推荐!

协同过滤的优势与挑战

优点

  • 无需物品特征:完全基于行为数据,适用于任何可交互的内容;
  • 能发现跨类别关联:比如“买尿布的人也买啤酒”这类隐性规律;
  • 个性化更强:不同用户即使看同一类内容,也可能因行为差异收到不同推荐。

挑战

  • 冷启动问题:新用户没有行为记录,无法计算相似度;
  • 数据稀疏性:在大型平台,用户只接触极小部分物品,导致相似度计算不可靠;
  • 可扩展性差:用户量大时,计算所有用户两两相似度成本极高(O(n²))。

小结

协同过滤跳出了“物品特征”的框架,转而从用户群体的行为共性中寻找答案。它让推荐系统具备了“发现未知兴趣”的能力,是推荐发展史上的重要里程碑。

但面对海量稀疏数据,传统协同过滤也力不从心。如何在低维空间中高效建模用户与物品的复杂关系?这就引出了下一篇的主题:矩阵分解

预告:在《推荐系统入门(三):矩阵分解 —— 用潜在因子破解稀疏难题》中,我们将把用户和物品映射到一个“隐语义空间”,用数学的力量从碎片化行为中还原完整偏好。敬请期待!


注:本文代码可直接运行,依赖pandasscikit-learn。建议先掌握第一篇内容,再进入本篇,理解更顺畅。

http://www.jsqmd.com/news/538148/

相关文章:

  • Koodo Reader TTS语音朗读高效全攻略:解放双眼的沉浸式听书体验
  • XUnity.AutoTranslator:Unity游戏自动翻译解决方案
  • 2026年全国叛逆孩子特训学校费用大揭秘,怎么收费 - 工业品网
  • 开源阅读鸿蒙版终极指南:三分钟打造你的专属数字书房
  • qwen3.5 vllm本地部署
  • Phi-3-mini-128k-instruct学习C语言:指针与内存管理难点解析
  • PyLink 实战技巧:从基础连接到高级调试
  • Linux原生B站客户端:突破平台限制的深度体验指南
  • 2026一键式测量仪哪家强?国产品牌VS国际大牌,真实测评告诉你答案 - 品牌推荐大师1
  • MobaXterm远程免密登录疑难杂症全解析:从pk.pub到authorized_keys的避坑指南
  • 3分钟搞定Windows音频捕获:win-capture-audio让你的录音效率翻倍
  • 路由器实例 useRouter,当前路由信息 useRoute(params, query)
  • 美超微案件凸显人工智能基础设施供应链风险
  • 2026年共话防火门实力厂商,南京泰瀚科技获客户认可 - 工业品牌热点
  • 保姆级教程:在Next.js App Router项目中,从API路由到前端按钮的完整删除流程
  • 股票可视化的毕设:从零构建一个可交互的金融数据看板(新手入门实战)
  • 上海高端腕表鉴定维修全攻略:38个奢华品牌故障解析+六城门店实测(含2026权威数据) - 时光修表匠
  • 一键解决中文文献管理痛点:茉莉花插件让Zotero效率提升90%的完整指南
  • DataEyes聚合平台新API接入实战指南:从0到1打通实时数据链路
  • 如何3分钟搞定本地语音转文字:TMSpeech终极高效方案
  • 从 nvm 到 Volta:前端工具链管理的演进与自动化实践
  • 别再对着手册发愁了!手把手教你用Vivado配置Xilinx FFT IP核(附时序仿真与资源优化技巧)
  • 微信聊天记录备份指南:3步轻松保护你的珍贵回忆
  • 智能客服Agent实战:从零搭建高可用对话系统的全流程指南
  • RK3568 Android12长按电源键无反应?三步搞定关机菜单恢复
  • 从原理到实践:Matlab相机标定参数详解与坐标变换全流程
  • MZmine 3:开源质谱数据处理软件的终极实战指南
  • Phi-4-Reasoning-Vision开发者案例:与LangChain集成实现多跳图文推理链
  • 颈肩痛分急性和慢性,对症缓解才有效
  • Magisk Root技术实践指南:从决策评估到风险管控的完整解决方案