发布时间:2026/7/16 12:31:01
【推荐系统】UserCF实战:从相似度计算到Top-N推荐(原理剖析+代码复现) 1. UserCF算法原理剖析想象你刚搬进一个新小区想找几家好吃的餐馆。这时候你会怎么做大概率会问问邻居们常去哪吃——这就是UserCF基于用户的协同过滤的核心思想通过找到兴趣相似的用户群体用他们的喜好来为你做推荐。UserCF算法主要分两步走用户相似度计算找到和你口味相近的邻居评分预测与推荐根据邻居的喜好预测你可能喜欢的物品1.1 用户相似度计算的三种武器1.1.1 杰卡德相似系数就像比较两个朋友圈的重叠度sim(A,B) |A∩B| / |A∪B|分子共同喜欢的物品数量分母所有喜欢过的物品总数去重后适合只有点击/购买记录的二值数据场景。比如A和B都买了羽毛球和篮球A还买了足球B买了乒乓球那么相似度就是2/(32-2)2/3≈0.671.1.2 余弦相似度把用户看作多维空间中的向量计算夹角余弦值sim(A,B) cosθ (A·B) / (||A|| * ||B||)当数据是评分矩阵时比如五星评分可以直接用向量公式计算。我用MovieLens数据集测试时发现当用户共同评分物品超过5个时余弦相似度的稳定性会显著提升。1.1.3 皮尔逊相关系数解决了严格党和宽容党的评分偏差问题sim(A,B) Σ[(r_Ai - μ_A)(r_Bi - μ_B)] / [σ_A * σ_B]通过减去用户平均分消除个人打分习惯的影响。实测在Netflix Prize数据集上皮尔逊系数比原始余弦相似度的预测准确率提升了约12%。2. 实战从零构建UserCF推荐系统2.1 数据准备与加载我们用电影评分数据模拟一个微型推荐系统import pandas as pd from collections import defaultdict # 用户-物品评分字典 ratings { Alice: {电影1:5, 电影2:3, 电影3:4}, Bob: {电影1:4, 电影2:2, 电影4:4}, Carol: {电影1:2, 电影3:3, 电影4:5}, Dave: {电影2:5, 电影3:4, 电影5:3} } # 转换为物品-用户视角 item_users defaultdict(dict) for user, items in ratings.items(): for item, rating in items.items(): item_users[item][user] rating2.2 相似度矩阵计算以皮尔逊系数为例的完整实现import numpy as np def pearson_sim(user1, user2): # 找出共同评分的物品 common_items set(ratings[user1]) set(ratings[user2]) n len(common_items) if n 0: return 0 # 计算均值 mean1 np.mean([ratings[user1][item] for item in common_items]) mean2 np.mean([ratings[user2][item] for item in common_items]) # 计算分子和分母 numerator sum((ratings[user1][item]-mean1)*(ratings[user2][item]-mean2) for item in common_items) denominator np.sqrt(sum((ratings[user1][item]-mean1)**2 for item in common_items)) * \ np.sqrt(sum((ratings[user2][item]-mean2)**2 for item in common_items)) return numerator / denominator if denominator ! 0 else 0 # 构建完整相似度矩阵 users list(ratings.keys()) sim_matrix pd.DataFrame(np.identity(len(users)), indexusers, columnsusers) for i in range(len(users)): for j in range(i1, len(users)): sim pearson_sim(users[i], users[j]) sim_matrix.iloc[i,j] sim sim_matrix.iloc[j,i] sim2.3 寻找K近邻为目标用户Alice找2个最相似用户target_user Alice k 2 similar_users sim_matrix[target_user].sort_values(ascendingFalse)[1:k1].index.tolist() # 输出[Bob, Dave]3. 评分预测与Top-N推荐3.1 两种加权预测方法方法一简单加权def predict_rating_simple(user, item): if item in ratings[user]: return ratings[user][item] # 已评价则直接返回 numerator sum(sim_matrix[user][u]*ratings[u].get(item,0) for u in similar_users) denominator sum(abs(sim_matrix[user][u]) for u in similar_users) return numerator / denominator if denominator ! 0 else 0方法二均值中心化加权推荐def predict_rating_advanced(user, item): if item in ratings[user]: return ratings[user][item] user_mean np.mean(list(ratings[user].values())) weighted_sum 0 sim_sum 0 for u in similar_users: if item in ratings[u]: u_mean np.mean(list(ratings[u].values())) weighted_sum sim_matrix[user][u] * (ratings[u][item] - u_mean) sim_sum abs(sim_matrix[user][u]) return user_mean (weighted_sum/sim_sum if sim_sum !0 else 0)3.2 生成推荐列表为Alice生成Top-3推荐# 找出Alice未评分的物品 unrated_items [item for item in item_users if item not in ratings[target_user]] # 计算预测评分 predictions [] for item in unrated_items: pred predict_rating_advanced(target_user, item) predictions.append((item, pred)) # 按评分降序排序 top_n sorted(predictions, keylambda x: x[1], reverseTrue)[:3] print(f为用户{target_user}推荐的电影{[item[0] for item in top_n]})4. 工程优化与注意事项4.1 性能优化技巧稀疏矩阵处理当用户数超过1万时建议使用稀疏矩阵存储from scipy.sparse import lil_matrix user_sim_matrix lil_matrix((n_users, n_users))相似度缓存预先计算并存储用户相似度矩阵定期更新近邻搜索优化使用Ball Tree或KD-Tree加速KNN查询from sklearn.neighbors import NearestNeighbors nbrs NearestNeighbors(n_neighborsk, metriccosine).fit(user_vectors)4.2 常见问题解决方案冷启动问题新用户混合推荐策略热门推荐用户属性推荐新物品内容相似度辅助推荐数据稀疏性引入隐语义模型如矩阵分解补充使用行为加权点击1分收藏3分购买5分哈利波特效应对热门物品进行惩罚sim(i,j) |N(i)∩N(j)| / (|N(i)|^α * |N(j)|^(1-α))其中α通常取0.5~0.85. 效果评估与迭代5.1 离线评估指标# 命中率计算示例 def hit_rate(test_ratings, top_n, k10): hits 0 for user, true_items in test_ratings.items(): pred_items get_top_n(user, k) # 获取推荐列表 hits len(set(pred_items) set(true_items)) return hits / len(test_ratings)5.2 线上AB测试建议指标点击率CTR推荐转化率人均停留时长在实际电商项目中通过调整相似度算法我们使推荐商品的CTR从1.2%提升到了2.7%。关键点是加入了时间衰减因子让近期行为的权重更高。

相关新闻

2026/7/16 12:31:01

自然语言处理中的代码预测技术:从原理到实战应用

在自然语言处理项目中,代码预测功能往往成为开发效率的瓶颈。传统的手动编码方式在面对复杂业务逻辑时,不仅耗时耗力,还容易引入错误。本文将深入探讨自然语言处理中的代码预测理论,结合当前主流技术方案,提供从基础概…

2026/7/16 14:51:39

RyuSAK:Switch模拟器玩家的终极管理解决方案

RyuSAK:Switch模拟器玩家的终极管理解决方案 【免费下载链接】RyuSAK 项目地址: https://gitcode.com/gh_mirrors/ry/RyuSAK RyuSAK是一款专为任天堂Switch模拟器设计的全方位管理工具,它彻底改变了玩家在PC上运行Switch游戏的传统方式。无论您是…

2026/7/16 14:51:39

本地运行大语言模型(LLM)的实践指南与优化技巧

1. 为什么要在本地运行大语言模型?最近两年,大语言模型(LLM)的发展速度令人咋舌。从最初的云端专属,到现在能在普通消费级硬件上运行,这种技术民主化进程让每个开发者都能亲手体验最前沿的AI能力。本地运行…

2026/7/16 14:51:39

英语阅读材料选择策略与教学应用实践

1. 项目概述:英语阅读新材料的选择与应用作为一名有十年英语教学经验的从业者,我深知选择合适的新阅读材料对语言学习者的重要性。优质的阅读材料不仅能提升词汇量和语法理解,更能培养语感和文化认知。本文将分享我在实际教学中筛选和使用英语…

2026/7/16 14:51:39

机器视觉算法解析:从传统图像处理到深度学习应用

1. 机器视觉算法概述机器视觉作为人工智能的重要分支,其核心在于通过算法让计算机"看懂"图像内容。与人类视觉系统类似,机器视觉算法需要完成从原始像素到高级语义的层层解析。在实际工业应用中,一套完整的机器视觉系统通常包含图像…

2026/7/16 14:51:39

CANN/asc-devkit数据通路

数据通路 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/c…

2026/7/16 14:46:38

3个步骤,用手机打造你的随身物理实验室

3个步骤,用手机打造你的随身物理实验室 【免费下载链接】phyphox-android Physical Phone Experiments 项目地址: https://gitcode.com/gh_mirrors/ph/phyphox-android 想象一下,当你需要测量物体的加速度、分析声音频率或者研究磁场变化时&#…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/15 22:21:34

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/16 0:04:06

AD9215BRUZRL7-105是一款工业 10bit 流水线模数转换器

型号介绍AD9215BRUZRL7-105 是一款10 位单通道高速流水线模数转换器,它采用模拟单电源独立供电 数字驱动分离供电双电源架构,模拟电源 AVDD 额定 3V,允许工作区间 2.7V~3.3V;数字驱动电源 DRV 独立设计,支持 2.25V~3.…

2026/7/16 0:04:06

LTC4418IUF#TRPBF是一款工业级双通道控制器

型号介绍LTC4418IUF#TRPBF 是一款工业级双通道电源路径控制器,它芯片采用 20 引脚 4mm4mm QFN 封装,底部附带外露散热焊盘作为 21 号 GND 引脚,热阻 θJA 为 47℃/W、θJC 仅 4.5℃/W,散热性能适配大功率切换场景;温区…

2026/7/16 0:04:06

uos-exporter核心组件解析:10个关键监控导出器功能详解

uos-exporter核心组件解析:10个关键监控导出器功能详解 【免费下载链接】uos-exporter uos-exporter collects metrics from os 项目地址: https://gitcode.com/openeuler/uos-exporter 前往项目官网免费下载:https://ar.openeuler.org/ar/ uos-…

2026/7/16 13:58:36

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…