首页 > 其他分享 >推荐系统的基础_协同过滤(CF)

推荐系统的基础_协同过滤(CF)

时间:2024-09-09 11:51:48浏览次数:5  
标签:协同 similarity 评分 电影 CF 用户 过滤 相似 物品

协同过滤(Collaborative Filtering)是一种推荐系统算法,它通过分析用户之间的相似性或者物品之间的相似性来预测用户可能感兴趣的物品。协同过滤算法主要有两种类型:

1. 用户基协同过滤(User-based Collaborative Filtering):
   这种方法通过找到与目标用户兴趣相似的其他用户,然后推荐这些相似用户喜欢的物品给目标用户。它依赖于用户之间的相似度计算,通常使用评分数据来确定用户之间的相似性。例如,如果用户A和用户B对多个物品的评分很相似,那么用户A喜欢的物品很可能也会被用户B喜欢。

2. 物品基协同过滤(Item-based Collaborative Filtering):
   这种方法通过分析用户对物品的评分,找出相似的物品,然后将这些相似物品推荐给用户。它依赖于物品之间的相似度计算,通常也是基于用户的评分数据。例如,如果物品X和物品Y经常被相似的用户评分,那么喜欢物品X的用户也可能会喜欢物品Y。

协同过滤算法的关键在于如何准确计算用户或物品之间的相似度。常用的相似度计算方法包括:

  • 皮尔逊相关系数(Pearson Correlation):衡量两个用户或物品评分向量之间的线性相关性。
  • 余弦相似度(Cosine Similarity):通过计算两个评分向量的夹角的余弦值来衡量相似度,对评分尺度不敏感。
  • 欧几里得距离(Euclidean Distance):衡量两个评分向量在多维空间中的直线距离。

一:用户基协同过滤

实现用户基协同过滤(User-Based Collaborative Filtering)的实例通常涉及以下步骤:

  1. 数据收集:收集用户对项目的评分数据。
  2. 用户相似度计算:计算用户之间的相似度,常用的方法有余弦相似度、皮尔逊相关系数等。
  3. 邻居选择:根据相似度选择与目标用户最相似的邻居用户。
  4. 推荐生成:根据邻居用户的评分预测目标用户对未评分项目的评分,并生成推荐列表。

为了展示这一过程,将使用一个简化的示例。假设我们有以下用户对电影的评分数据:

用户/电影电影1电影2电影3电影4
用户15432
用户24521
用户33354
用户42145

我们将计算用户之间的相似度,并选择与用户1最相似的邻居,然后预测用户1对电影4的评分。

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 评分数据
ratings = np.array([
    [5, 4, 3, 2],
    [4, 5, 2, 1],
    [3, 3, 5, 4],
    [2, 1, 4, 5]
])

# 计算用户之间的余弦相似度
user_similarity = cosine_similarity(ratings)
user_similarity

结果如下:

我们计算了用户之间的余弦相似度,得到了一个相似度矩阵。例如,用户1和用户2之间的相似度为0.963,用户1和用户3之间的相似度为0.886,依此类推。

接下来,我们将选择与用户1最相似的邻居用户,并使用这些邻居的评分来预测用户1对电影4的评分。为了简化,我们这里只选择一个最相似的邻居(用户2)。

预测用户1对电影4的评分的公式为:

预测评分 = 用户1的平均评分 + 相似度 × (用户2对电影4的评分 − 用户2的平均评分)

现在,我将计算用户1对电影4的预测评分。

# 计算用户平均评分
user_means = np.mean(ratings, axis=1)

# 用户1和用户2的相似度
similarity_user1_user2 = user_similarity[0, 1]

# 用户2对电影4的评分
rating_user2_movie4 = ratings[1, 3]

# 用户2的平均评分
mean_user2 = user_means[1]

# 用户1的平均评分
mean_user1 = user_means[0]

# 预测用户1对电影4的评分
predicted_rating_user1_movie4 = mean_user1 + similarity_user1_user2 * (rating_user2_movie4 - mean_user2)
predicted_rating_user1_movie4

根据计算,用户1对电影4的预测评分约为1.57。这意味着基于用户之间的相似度,我们预测用户1可能不会特别喜欢电影4,因为该评分低于用户1的平均评分。

二:物品基协同过滤

实现物品基协同过滤(Item-Based Collaborative Filtering)的实例通常涉及以下步骤:

  1. 数据收集:收集用户对项目的评分数据。
  2. 物品相似度计算:计算物品之间的相似度,常用的方法有余弦相似度、皮尔逊相关系数等。
  3. 邻居选择:根据相似度选择与目标物品最相似的邻居物品。
  4. 推荐生成:根据邻居物品的评分预测目标用户对未评分项目的评分,并生成推荐列表。

为了展示这一过程,我将仍然使用以上用户对电影的评分数据。同理可得:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 评分数据
ratings = np.array([
    [5, 4, 3, 2],
    [4, 5, 2, 1],
    [3, 3, 5, 4],
    [2, 1, 4, 5]
])

# 计算电影之间的余弦相似度
item_similarity = cosine_similarity(ratings.T)
item_similarity

结果如下:

我们计算了电影之间的余弦相似度,得到了一个相似度矩阵。例如,电影1和电影2之间的相似度为0.972,电影1和电影3之间的相似度为0.852,依此类推。

接下来,我们将选择与电影1最相似的邻居电影,并使用这些邻居的评分来预测用户1对电影4的评分。为了简化,我们这里只选择一个最相似的邻居(电影2)。

预测用户1对电影4的评分的公式为:

预测评分 = 用户1的平均评分 + 相似度 × (用户1对电影2的评分 − 电影2的平均评分)

现在,我将计算用户1对电影4的预测评分。

# 计算电影平均评分
item_means = np.mean(ratings, axis=0)

# 电影1和电影2的相似度
similarity_movie1_movie2 = item_similarity[0, 1]

# 用户1对电影2的评分
rating_user1_movie2 = ratings[0, 1]

# 电影2的平均评分
mean_movie2 = item_means[1]

# 用户1的平均评分
mean_user1 = np.mean(ratings[0, :])

# 预测用户1对电影4的评分
predicted_rating_user1_movie4 = mean_user1 + similarity_movie1_movie2 * (rating_user1_movie2 - mean_movie2)
predicted_rating_user1_movie4

根据计算,用户1对电影4的预测评分约为4.23。这意味着基于电影之间的相似度,我们预测用户1可能会比较喜欢电影4,因为该评分高于用户1的平均评分。

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

标签:协同,similarity,评分,电影,CF,用户,过滤,相似,物品
From: https://blog.csdn.net/2301_80651329/article/details/141931081

相关文章

  • Linux目录结构进阶和过滤命令(三)
    1.日志查询四剑客注意:查看日志的时候不要用cat或者vim命令,在工作中日志的内容很多,用cat会刷屏,用vim又特别的占用内存,所以我们引出了四条有关查看日志的相关命令1.1四剑客之headhead#显示文件的头几行,默认显示十行head-nnum#显示头num行实例一:显示/etc/passwd的......
  • CF1534F2 Falling Sand (Hard Version) 题解
    题目链接点击打开链接题目解法做法1一个沙子消失,会带走所有它所在列下面的沙子我们记每列从下往上第\(a_i\)个沙子为关键点,第\(i\)列至少消失\(a_i\)个沙子等价于所有关键点都消失一个显然的事情是:记一列最上面的沙子为起始点,则我们只会干扰起始点第一感觉是找到一......
  • CF 2008 H
    题目描述给定一个长度为\(N\)的序列\(A\),以及\(Q\)次询问,每次询问给定一个\(x\)。你可以执行以下操作任意次:选择一个\(1\lei\leN\)使得\(A_i\gex\)。令\(A_i\leftarrowA_i-x\)。求\(A\)的最小中位数。这里中位数是\(A\)排序后的第\(\lfloor\frac......
  • CF1926G Vlad and Trouble at MIT
    题意有一棵树,树上每个节点有\(C\),\(S\),\(P\)三种,现在可以选择一些边断掉,使得每个连通块内没有同时出现\(S\),\(P\)的情况,问最少断多少条思路板子树形\(DP\)考虑\(dp_{i,0/1,0/1}\)表示以\(i\)为子树,是否有跟\(i\)联通的\(S\)和\(P\)转移dp[x][0][0]+=......
  • 【题解】CF1955E
    CF1955E翻译思路代码翻译原题链接CF1955E思路  由于每次操作区间长度是定值,所以我们可以说,如果最前面的数已经是1了,那它再也不会被进入操作。因为如果把它变回0,那想再变成1只能以它为起点再操作一次,前后两次操作抵消。  所以思路很简单,直接......
  • CF2002D2 DFS Checker (Hard Version) 题解
    https://codeforces.com/problemset/problem/2002/D2考虑找一个容易维护的必要条件,再证明充分性。最容易想到的是每个子树对应一个区间,子树根位于左端点sol1相邻的结点\(p_{i-1},p_i\)有两种情况:\(fa[p_i]=p_{i-1}\);叶子\(p_{i-1}\)在子树\(fa[p_i]\)中,回溯到\(fa[......
  • CF1991F Triangle Formation 题解
    Description你有\(n\)根棍子,从\(1\)到\(n\)编号。第\(i\)根棍子的长度是\(a_i\)。你需要回答\(q\)个问题。在每个查询中,你会得到两个整数\(l\)和\(r\)(\(1\lel<r\len,r−l+1\ge6\))。确定是否可以从编号为\(l\)到\(r\)的棒中选择\(6\)个不同的棒,形......
  • CF1991E Coloring Game 题解
    Description有一个由\(n\)个顶点和\(m\)条边组成的无向图。每个顶点可以用三种颜色之一着色:\(1\)、\(2\)或\(3\)。初始时,所有顶点都未着色。Alice和Bob正在玩一个包含\(n\)轮的游戏。在每一轮中,都会发生以下两个步骤:Alice选择两种不同的颜色。Bob选择一个未......
  • CF2009G. Yunli's Subarray Queries 题解
    G1题目要求,对于一个子区间$a_{l\siml+k-1}$,最少要进行多少次单点修改,才能使$\forall\l<i\leql+k-1,a_i=a_{i-1}+1$,其中$k$是固定的。对于这种问题,我们通常有一个trick:将$a_i$变为$a_i-i$。这样的话,我们要求的答案就变为了$k$减去变化后的$a_{l\siml+k-1}$......
  • Java计算机毕业设计协同过滤图书(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息爆炸的时代,图书资源浩如烟海,读者在浩瀚的书海中寻找自己感兴趣的书籍往往费时费力。传统的图书推荐方式依赖于编辑推荐、畅销书榜单或读者主动......