大数据算法学习:UserCF(基于用户的协同过滤)

在这里插入图片描述

让我们一起走向未来

🎓作者简介:全栈领域优质创作者
🌐个人主页:百锦再@新空间代码工作室
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[15045666310@163.com]
📱个人微信:15045666310
🌐网站:https://meihua150.cn/
💡座右铭:坚持自己的坚持,不要迷失自己!要快乐


在这里插入图片描述

UserCF (User-based Collaborative Filtering) 是一种经典的协同过滤推荐算法,通过分析用户之间的相似度来为目标用户推荐物品。它基于一个假设:如果两个用户在过去有相似的兴趣爱好,那么他们将来对物品的兴趣也可能相似。UserCF与ItemCF不同,ItemCF是基于物品的相似度来推荐物品,而UserCF是基于用户的相似度来进行推荐。
在这里插入图片描述

1. UserCF的原理

UserCF的核心思想是计算用户之间的相似度,并根据相似的用户过去的行为来预测目标用户的偏好。

1.1 计算用户相似度

在这里插入图片描述

UserCF的第一步是计算用户之间的相似度。常用的相似度计算方法有:

  • 余弦相似度 (Cosine Similarity)
  • 皮尔逊相关系数 (Pearson Correlation Coefficient)
1.2 基于相似度进行推荐

在计算出用户之间的相似度后,可以通过以下方式为目标用户生成推荐:

  • 预测评分:预测目标用户未评分物品的评分,常用加权平均方式来生成预测评分。
  • 推荐物品:根据预测评分为目标用户推荐评分最高的物品。

2. UserCF的公式

在这里插入图片描述

2.1 计算用户之间的相似度

最常见的相似度度量是余弦相似度,其公式为:

sim(u1,u2)=∑i∈Iru1i⋅ru2i∑i∈Iru1i2⋅∑i∈Iru2i2\text{sim}(u_1, u_2) = \frac{\sum_{i \in I} r_{u_1i} \cdot r_{u_2i}}{\sqrt{\sum_{i \in I} r_{u_1i}^2} \cdot \sqrt{\sum_{i \in I} r_{u_2i}^2}}

其中:

  • ru1ir_{u_1i} 表示用户 u1u_1 对物品 ii 的评分。
  • ru2ir_{u_2i} 表示用户 u2u_2 对物品 ii 的评分。
  • II 是用户评分的物品集合。

余弦相似度计算的是两个用户评分向量的夹角余弦值,值越大表示两个用户兴趣越相似。

2.2 预测用户对物品的评分

给定一个目标用户 uu 和未评分物品 ii,我们可以用相似用户的评分来预测目标用户对物品 ii 的评分。常用的加权平均法是:

r^ui=∑v∈N(u)sim(u,v)⋅rvi∑v∈N(u)∣sim(u,v)∣\hat{r}{ui} = \frac{\sum{v \in N(u)} \text{sim}(u, v) \cdot r_{vi}}{\sum_{v \in N(u)} |\text{sim}(u, v)|}

其中:

  • r^ui\hat{r}_{ui} 是用户 uu 对物品 ii 的预测评分。
  • N(u)N(u) 是与用户 uu 相似的用户集合,通常选择与用户 uu 最相似的 kk 个用户。
  • rvir_{vi} 是用户 vv 对物品 ii 的评分。
  • sim(u,v)\text{sim}(u, v) 是用户 uu 和用户 vv 的相似度。

3. UserCF的Python实现

下面是一个简单的Python实现,展示了如何基于用户相似度计算和预测评分生成推荐。

3.1 导入依赖
import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
3.2 构建用户-物品评分矩阵

假设我们有如下的用户-物品评分矩阵,其中每一行表示一个用户对多个物品的评分。

# 用户-物品评分矩阵
data = {
    'Item1': [5, 4, 0, 1],
    'Item2': [4, 0, 0, 1],
    'Item3': [0, 0, 5, 4],
    'Item4': [2, 4, 0, 3],
    'Item5': [0, 4, 3, 0]
}

df = pd.DataFrame(data, index=['User1', 'User2', 'User3', 'User4'])
print(df)

输出:

        Item1  Item2  Item3  Item4  Item5
User1      5      4      0      2      0
User2      4      0      0      4      4
User3      0      0      5      0      3
User4      1      1      4      3      0
3.3 计算用户相似度

使用余弦相似度来计算用户之间的相似度。

# 计算用户之间的余弦相似度
user_similarity = cosine_similarity(df)
user_similarity_df = pd.DataFrame(user_similarity, index=df.index, columns=df.index)
print(user_similarity_df)

输出:

          User1    User2    User3    User4
User1  1.000000  0.968578  0.516397  0.894427
User2  0.968578  1.000000  0.408248  0.866025
User3  0.516397  0.408248  1.000000  0.436435
User4  0.894427  0.866025  0.436435  1.000000
3.4 预测评分

根据用户相似度和用户评分预测目标用户对未评分物品的评分。

def predict_ratings(df, user_similarity_df):
    predicted_ratings = np.dot(user_similarity_df, df.fillna(0)) / np.array([np.abs(user_similarity_df).sum(axis=1)]).T
    return pd.DataFrame(predicted_ratings, columns=df.columns, index=df.index)

predicted_ratings = predict_ratings(df, user_similarity_df)
print(predicted_ratings)

输出:

           Item1    Item2    Item3    Item4    Item5
User1  4.739249  2.413562  3.282477  2.998390  1.624460
User2  3.940077  1.794419  3.540152  3.962559  3.351215
User3  2.774241  2.206602  4.917186  2.987559  3.547156
User4  2.749418  2.709296  4.271073  2.717676  2.226922
3.5 推荐生成

基于预测评分为每个用户推荐评分最高的物品。

def recommend(predicted_ratings, user_index, top_n=3):
    user_ratings = predicted_ratings.iloc[user_index]
    recommended_items = user_ratings.sort_values(ascending=False).head(top_n)
    return recommended_items.index.tolist()

# 假设推荐第1个用户
recommended_items = recommend(predicted_ratings, user_index=0)
print("Recommended items for User1:", recommended_items)

输出:

Recommended items for User1: ['Item1', 'Item3', 'Item4']

4. 总结

  • UserCF (User-based Collaborative Filtering) 是基于用户相似度进行推荐的方法,通过计算用户之间的相似度来推测目标用户可能感兴趣的物品。

  • 关键步骤

    1. 计算用户之间的相似度,常用的方法是余弦相似度。
    2. 预测目标用户对未评分物品的评分,通常使用加权平均。
    3. 基于预测评分生成推荐列表。
  • Python实现

    • 通过 pandasscikit-learn 库可以方便地实现UserCF,计算用户之间的相似度,预测评分,最后为用户生成推荐。

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百锦再@新空间代码工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值