协同过滤(collaborative filtering)

协同过滤是推荐系统中常用算法,分为user-based和item-based两种。它基于用户与物品的交互,通过发现用户间的相似性或物品间的相似性进行推荐。文章介绍了核心公式、相似度计算方法、算法优化目标及其实战中的注意事项,并解答了算法相关问题。

协同过滤简介

协同过滤是推荐算法中最常用的算法之一,它根据user与item的交互,发现item之间的相关性,或者发现user之间的相关性,进行推荐。

  • 比如你有位朋友看电影的爱好跟你类似,然后最近新上了《调音师》,他觉得不错,就会推荐给你,这是最简单的基于user的协同过滤算法(user-based collaboratIve filtering)
  • 还有一种是基于item的协同过滤算法(item-based collaborative filtering),比如你非常喜欢电影《当幸福来敲门的时候》,那么观影系统可能会推荐一些类似的励志片给你,比如《风雨哈佛路》等。

以下主要分析user-based,item-based。

导图

在这里插入图片描述

核心公式:

符号

r u , i r_{u,i} ru,iuser u u u 对 item i i i 的评分
r ˉ u \bar{r}_{u} rˉu:user u u u 的平均评分
P a , b P_{a,b} Pa,b:用户 a a a, b b b都有评价的items集合

公式

1.item-based CF 邻域方法预测公式

Pred ⁡ ( u , i ) = r ‾ u + ∑ j ∈ S i ( sim ⁡ ( i , j ) × r u , j ) ∑ j ∈ S i sim ⁡ ( i , j ) \operatorname{Pred}(u, i)=\overline{r}_{u}+\frac{\sum_{j \in S_{i}}\left(\operatorname{sim}(i, j) \times r_{u, j}\right)}{\sum_{j \in S_{i}} \operatorname{sim}(i, j)} Pred(u,i)=ru+jSisim(i,j)jSi(sim(i,j)×ru,j)

2.偏差优化目标
min ⁡ b ∑ ( u , i ) ∈ K ( r ( u , i ) − μ − b u − b i ) 2 \min _{b} \sum_{(u, i) \in K}\left(r_{(u, i)}-\mu-b_{u}-b_{i}\right)^{2} bmin(u,i)K(r(u,i)μbubi)2其中 ( u , i ) ∈ K (u,i) \in K (ui)K表示所有的评分, μ \mu μ总评分均值, b u b_u bu为user u u u的偏差, b i b_i bi为item i i i 的偏差。

  • 加入正则项后的Funk SVD 优化公式
    min ⁡ u v ∑ ( u , i ) ∈ k n o w n ( r u , i − u u v i ) + λ ( ∣ u ∣ 2 + ∣ v ∣ 2 ) \min _{u v} \sum_{(u, i) \in k n o w n}\left(r_{u,i}-u_{u} v_{i}\right)+\lambda\left(|u|^{2}+|v|^{2}\right) uvmin(u,i)known(ru,iuuvi)+λ(u2+v2)其中 u u u_u uu为user u u u的偏好,即为user特征矩阵 U U U的第 u u u行, v i v_i vi为item i i i的特征,即为特征矩阵 V V V的第 i i i

算法十问

  1. 相似度与距离之间的关系?

距离越大,相似度越小;距离越小,相似度越高。即在求解最大相似度的时候可以转为求解最小距离。

  1. 在协同过滤中,常用的相似度函数有哪些?
  1. 杰卡德相似度(Jaccard similarity)
    公式: s i m j a c c a r d ( u 1 , u 2 ) = items bought by  u 1   a n d   u 2  items bought by  u 1   o r   u 2 sim_{jaccard}(u_{1}, u_{2})=\frac{ \text {items} \text { bought by } u_{1}\ and\ u_{2}}{ \text { items bought by } u_{1}\ or\ u_{2}} simjaccard
<think>好的,我需要回答用户关于协同过滤Collaborative Filtering, CF)的算法原理和实现方法。首先,我得回顾一下用户提供的引用资料,确保信息准确。根据引用[1]和[3],协同过滤分为基于用户的和基于物品的两种类型。用户可能想知道两者的区别和各自的实现步骤。 首先,要解释协同过滤的核心思想,即利用用户行为数据,假设相似用户或物品会有相似的偏好。引用[4]提到,它不依赖物品属性,而是用户与物品的交互历史,比如评分或购买记录。接下来,需要详细说明User-Based CF和Item-Based CF的算法步骤,比如相似度计算和推荐生成。 关于实现方法,可能需要提到矩阵分解或最近邻技术。例如,计算用户相似度可以使用余弦相似度或皮尔逊相关系数,如引用[2]中的案例实践。此外,用户可能对具体的数学公式感兴趣,比如相似度计算的公式,这时候要使用LaTeX格式,如$sim(u,v) = \frac{\sum_{i}(r_{ui} - \bar{r}_u)(r_{vi} - \bar{r}_v)}{\sqrt{\sum_{i}(r_{ui} - \bar{r}_u)^2} \sqrt{\sum_{i}(r_{vi} - \bar{r}_v)^2}}$。 还要考虑冷启动和数据稀疏性问题,这是协同过滤的常见挑战,引用[3]和[4]都有提到。实现部分可能需要给出一个简单的代码示例,比如使用Python计算用户相似度或生成推荐列表。同时,要确保代码正确,使用正确的缩进和语法。 最后,生成相关问题时要涵盖原理、实现细节、优缺点比较以及应用场景,帮助用户进一步学习。需要检查所有LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,并且结构清晰,分点回答。</think>### 协同过滤Collaborative Filtering, CF)算法原理及实现 #### 一、核心原理 协同过滤基于以下假设:**相似用户对物品的偏好相似**,或**相似物品会被相似用户喜欢**。它通过分析用户与物品的交互历史(如评分、点击、购买等)构建推荐模型,无需依赖物品本身的属性信息[^4]。 #### 二、主要类型与实现步骤 1. **基于用户的协同过滤(User-Based CF)** - **步骤**: 1. 计算用户间的相似度(如余弦相似度、皮尔逊相关系数): $$ sim(u, v) = \frac{\sum_{i \in I_{uv}}(r_{ui} - \bar{r}_u)(r_{vi} - \bar{r}_v)}{\sqrt{\sum_{i \in I_{uv}}(r_{ui} - \bar{r}_u)^2} \sqrt{\sum_{i \in I_{uv}}(r_{vi} - \bar{r}_v)^2}} $$ 其中$I_{uv}$为用户$u$和$v$共同评分的物品集合,$r_{ui}$为用户$u$对物品$i$的评分。 2. 选择与目标用户最相似的$k$个邻居用户。 3. 根据邻居用户的评分加权预测目标用户对未评分物品的兴趣值: $$ \hat{r}_{ui} = \bar{r}_u + \frac{\sum_{v \in N(u)} sim(u, v) \cdot (r_{vi} - \bar{r}_v)}{\sum_{v \in N(u)} |sim(u, v)|} $$ 4. 推荐预测值最高的物品[^3][^4]。 2. **基于物品的协同过滤(Item-Based CF)** - **步骤**: 1. 计算物品间的相似度(如调整余弦相似度): $$ sim(i, j) = \frac{\sum_{u \in U_{ij}}(r_{ui} - \bar{r}_u)(r_{uj} - \bar{r}_u)}{\sqrt{\sum_{u \in U_{ij}}(r_{ui} - \bar{r}_u)^2} \sqrt{\sum_{u \in U_{ij}}(r_{uj} - \bar{r}_u)^2}} $$ 其中$U_{ij}$为同时对物品$i$和$j$评分的用户集合。 2. 选择与目标用户已评分物品最相似的$k$个物品。 3. 根据相似物品的评分加权预测目标用户对未评分物品的兴趣值: $$ \hat{r}_{ui} = \frac{\sum_{j \in N(i)} sim(i, j) \cdot r_{uj}}{\sum_{j \in N(i)} |sim(i, j)|} $$ 4. 推荐预测值最高的物品[^1][^3]。 #### 三、代码实现示例(基于用户的CF) ```python import numpy as np from sklearn.metrics.pairwise import cosine_similarity # 用户-物品评分矩阵(示例) ratings = np.array([ [5, 3, 0, 1], [4, 0, 0, 1], [1, 1, 0, 5], [0, 0, 0, 4], [0, 1, 5, 4], ]) # 计算用户相似度矩阵 user_similarity = cosine_similarity(ratings) # 预测用户u对物品i的评分 def predict_rating(u, i, k=2): # 找到相似度最高的k个用户 similar_users = np.argsort(user_similarity[u])[::-1][1:k+1] # 加权平均预测评分 numerator = sum(user_similarity[u][v] * ratings[v][i] for v in similar_users) denominator = sum(abs(user_similarity[u][v]) for v in similar_users) return numerator / denominator if denominator != 0 else 0 # 示例:预测用户0对物品2的评分 print(predict_rating(0, 2)) # 输出预测值 ``` #### 四、优缺点分析 - **优点**: 1. 无需领域知识,仅依赖用户行为数据[^4]。 2. 可发现长尾物品的潜在关联性。 - **缺点**: 1. **冷启动问题**:新用户或物品缺少历史数据时无法推荐[^3]。 2. **数据稀疏性**:用户-物品矩阵稀疏时推荐质量下降。 3. **可扩展性**:计算用户/物品相似度的时间复杂度高(可优化为矩阵分解或分布式计算)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值