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

Python协同过滤算法:从原理到实战应用

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

在这里插入图片描述

💖The Start💖点点关注,收藏不迷路💖

📒文章目录

    • 1. 协同过滤算法基础
      • 1.1 什么是协同过滤?
      • 1.2 协同过滤的主要类型
    • 2. 数据准备与相似度计算
      • 2.1 构建用户-物品矩阵
      • 2.2 相似度度量方法
    • 3. 实现协同过滤算法
      • 3.1 基于用户的协同过滤实现
      • 3.2 基于物品的协同过滤实现
    • 4. 算法评估与优化
      • 4.1 评估指标
      • 4.2 常见问题与解决方案
    • 5. 实战案例:电影推荐系统
      • 5.1 使用MovieLens数据集
      • 5.2 完整实现流程
    • 6. 总结


协同过滤是推荐系统中最经典和广泛应用的算法之一。Python凭借其简洁的语法和强大的科学计算库,成为实现协同过滤算法的理想选择。本文将深入解析协同过滤的核心原理,并通过Python代码示例展示如何从零实现一个推荐系统。


1. 协同过滤算法基础

1.1 什么是协同过滤?

协同过滤(Collaborative Filtering)是一种基于用户行为数据的推荐方法,其核心思想是"物以类聚,人以群分"。它通过分析用户的历史行为数据(如评分、购买记录等),发现用户或物品之间的相似性,从而为用户推荐可能感兴趣的物品。

与内容过滤不同,协同过滤不需要了解物品本身的属性特征,仅依靠用户行为数据就能产生推荐。这使得它特别适合那些难以提取内容特征的物品(如音乐、电影等)的推荐场景。

1.2 协同过滤的主要类型

协同过滤主要分为两种类型:

  1. 基于用户的协同过滤(User-based CF)

    • 找到与目标用户兴趣相似的用户群体
    • 根据这些相似用户的喜好来推荐物品
    • 适用于用户数量相对稳定的系统
  2. 基于物品的协同过滤(Item-based CF)

    • 计算物品之间的相似度
    • 根据用户历史喜欢的物品推荐相似物品
    • 适用于物品数量相对稳定的系统
  3. 混合协同过滤方法

    • 结合用户和物品的协同过滤
    • 可以缓解单一方法的局限性

2. 数据准备与相似度计算

2.1 构建用户-物品矩阵

用户-物品矩阵是协同过滤的基础数据结构,通常表示为二维矩阵,行代表用户,列代表物品,矩阵元素表示用户对物品的评分。

import pandas as pd
import numpy as np# 示例用户-物品评分矩阵
ratings = {'User1': [5, 3, 0, 1],'User2': [4, 0, 0, 1],'User3': [1, 1, 0, 5],'User4': [1, 0, 0, 4],'User5': [0, 1, 5, 4]
}df = pd.DataFrame(ratings, index=['Item1', 'Item2', 'Item3', 'Item4'])
print(df)

处理稀疏数据是协同过滤中的常见挑战,常用方法包括:

  • 均值填充
  • 降维处理
  • 使用更高效的稀疏矩阵存储格式

2.2 相似度度量方法

相似度计算是协同过滤的核心,以下是三种常用方法:

  1. 余弦相似度
from sklearn.metrics.pairwise import cosine_similarity# 计算物品之间的余弦相似度
item_similarity = cosine_similarity(df)
print(pd.DataFrame(item_similarity, index=df.index, columns=df.index))
  1. 皮尔逊相关系数
# 计算用户之间的皮尔逊相关系数
user_similarity = df.corr(method='pearson')
print(user_similarity)
  1. 调整余弦相似度
# 减去用户平均评分后的调整余弦相似度
mean_centered = df.sub(df.mean(axis=1), axis=0)
adjusted_cosine = cosine_similarity(mean_centered.fillna(0))

3. 实现协同过滤算法

3.1 基于用户的协同过滤实现

基于用户的协同过滤主要步骤:

  1. 计算用户相似度
  2. 选择最相似的k个用户
  3. 根据相似用户的评分预测目标用户对未评分物品的评分
def user_based_cf(user_id, item_id, ratings_df, k=2):# 计算用户相似度user_sim = ratings_df.corr(method='pearson')# 获取目标用户与其他用户的相似度并排序sim_users = user_sim[user_id].sort_values(ascending=False)[1:k+1]# 计算加权平均评分weighted_sum = 0sim_sum = 0for user, sim in sim_users.items():if not np.isnan(ratings_df.loc[item_id, user]):weighted_sum += sim * ratings_df.loc[item_id, user]sim_sum += simreturn weighted_sum / sim_sum if sim_sum != 0 else 0# 预测User1对Item3的评分
prediction = user_based_cf('User1', 'Item3', df)
print(f"预测评分: {prediction:.2f}")

3.2 基于物品的协同过滤实现

基于物品的协同过滤实现步骤:

  1. 计算物品相似度矩阵
  2. 对于目标用户已评分的物品,找到相似物品
  3. 根据相似度加权预测评分
def item_based_cf(user_id, item_id, ratings_df, k=2):# 计算物品相似度item_sim = cosine_similarity(ratings_df.fillna(0))item_sim_df = pd.DataFrame(item_sim, index=ratings_df.index, columns=ratings_df.index)# 获取用户已评分的物品user_ratings = ratings_df[user_id]rated_items = user_ratings[user_ratings > 0].index# 计算加权平均评分weighted_sum = 0sim_sum = 0for item in rated_items:if item != item_id and item_sim_df.loc[item_id, item] > 0:weighted_sum += item_sim_df.loc[item_id, item] * user_ratings[item]sim_sum += item_sim_df.loc[item_id, item]return weighted_sum / sim_sum if sim_sum != 0 else 0# 预测User1对Item3的评分
prediction = item_based_cf('User1', 'Item3', df)
print(f"预测评分: {prediction:.2f}")

4. 算法评估与优化

4.1 评估指标

  1. 均方根误差(RMSE)
from sklearn.metrics import mean_squared_errordef rmse(true_ratings, pred_ratings):return np.sqrt(mean_squared_error(true_ratings, pred_ratings))
  1. 平均绝对误差(MAE)
from sklearn.metrics import mean_absolute_errormae = mean_absolute_error(true_ratings, pred_ratings)
  1. 准确率与召回率
from sklearn.metrics import precision_score, recall_score# 将评分转换为二分类(如评分>3表示喜欢)
precision = precision_score(true_binary, pred_binary)
recall = recall_score(true_binary, pred_binary)

4.2 常见问题与解决方案

  1. 冷启动问题

    • 新用户:利用人口统计信息或要求初始评分
    • 新物品:结合内容过滤方法
  2. 数据稀疏性问题

    • 使用矩阵分解技术降维
    • 引入隐语义模型
  3. 算法扩展性优化

    • 使用近似最近邻算法
    • 分布式计算框架如Spark

5. 实战案例:电影推荐系统

5.1 使用MovieLens数据集

import pandas as pd# 加载数据
movies = pd.read_csv('movies.csv')
ratings = pd.read_csv('ratings.csv')# 创建用户-物品矩阵
ratings_matrix = ratings.pivot_table(index='userId', columns='movieId', values='rating')
print(f"矩阵稀疏度: {(1 - np.count_nonzero(ratings_matrix) / ratings_matrix.size) * 100:.2f}%")

5.2 完整实现流程

from surprise import Dataset, KNNBasic
from surprise.model_selection import cross_validate# 加载数据
data = Dataset.load_builtin('ml-100k')# 使用基于用户的协同过滤算法
algo = KNNBasic(sim_options={'user_based': True})# 交叉验证
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

结果可视化:

import matplotlib.pyplot as plt# 绘制用户评分分布
ratings['rating'].hist(bins=5)
plt.title('Rating Distribution')
plt.xlabel('Rating')
plt.ylabel('Count')
plt.show()

6. 总结

协同过滤是推荐系统领域最经典和实用的算法之一,其核心思想是利用群体智慧为用户提供个性化推荐。本文详细介绍了:

  1. 协同过滤的基本原理和两种主要类型
  2. 数据准备和相似度计算方法
  3. 基于用户和物品的协同过滤实现
  4. 评估指标和常见问题解决方案
  5. 完整的电影推荐系统实战案例

协同过滤的优势在于不需要物品内容信息,仅靠用户行为数据就能产生推荐,但也存在冷启动、数据稀疏性等挑战。对于想进一步深入学习的读者,可以探索:

  • 矩阵分解技术(如SVD、SVD++)
  • 深度学习推荐系统
  • 混合推荐方法

🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖
http://www.xdnf.cn/news/8661.html

相关文章:

  • 数据库6——综合实验-水果商店进阶一
  • C++题解(33)2025年顺德区中小学生程序设计展示活动(初中组C++)U560876 美丽数(一)和 U560878 美丽数(二)题解
  • 优启通添加自定义浏览器及EXLOAD使用技巧分享
  • 安全语音通信系统python
  • MSP430通用按键代码(KEY)设计与实现
  • 鸿蒙UI开发——Builder函数的封装
  • 【数据集】中国多属性建筑数据集CMAB
  • 互联网大厂Java求职面试实录 —— 严肃面试官遇到搞笑水货程序员
  • RAM(随机存取存储器)的通俗解释及其在路由器中的作用
  • 【Unity】使用InputSystem实现UI控件与键盘输入绑定以及如何快速制作虚拟摇杆
  • 前端错误监听与上报框架工作原理,如:Sentry
  • 全局异常处理器
  • 数据中台如何设计?中台开发技术方案,数据治理方案,大数据建设方案合集
  • 路径规划算法BFS/Astar/HybridAstar简单实现
  • C++ 内存管理与单例模式剖析
  • 单例模式总结
  • Redis 常用命令
  • 部署Gitlab-CE with Docker私有云环境
  • Windows系统定时备份/傲梅轻松备份
  • c++命名空间的作用及命名改编
  • 数据结构第七章(五)-散列表
  • BLIP3-o:理解和生成统一的多模态模型
  • Java 垃圾回收
  • 打卡day35
  • 产品经理常用术语大全
  • 《企业级日志该怎么打?Java日志规范、分层设计与埋点实践》
  • JWT笔记
  • 如何进行Appium实现移动端UI自动化测试?
  • 解决 Supabase “permission denied for table XXX“ 错误
  • python模块管理环境变量