推荐系统 —— 基于用户的协调过滤

本文介绍协同过滤推荐算法的基本原理及其实现过程,包括基于用户的协同过滤算法,通过计算用户间的相似度来推荐物品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

作为推荐系统 这一系列的第二篇文章,我们今天主要来聊一聊目前比较流行的一种推荐算法——协调过滤;
当然,这里我们只讲理论,并不会涉及到相关代码或者相关框架的使用,在这一系列的后续文章,如果可能,我们可以将我们的所有理论知识整合一下,实践一个 推荐系统的 实战。

协调过滤是什么

顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。这种仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法,一般来说可以分为以下几种:

  • 基于邻域的方法(neighborhood-based)
  • 隐语义模型(latent factor model)
  • 基于图的随机游走算法(random walk on graph)等

而今天我们要说的 基于用户的协调过滤 就是一种 基于邻域的方法;
基于邻域的方法 又可以分为以下两种算法:。

  • 基于物品的协同过滤算法
    这种算法给用户推荐和他之前喜欢的物品相似的物品。
  • 基于用户的协同过滤算法
    这个就是我们今天要讲的。

基于用户的协调过滤

  • 原理
    给用户推荐和他兴趣相似的其他用户喜欢的物品。

  • 实现步骤:

    • 找到和目标用户兴趣相似的用户集合。
    • 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
  • 实践(只是为了加深理解哈)
    上面都是空洞洞的文字描述,下面我们就一个列子来加深一下理解

    1. 收集数据,假设我们现以收集如下数据
    useritem1item2item3
    A110
    B111
    C011

    这是一个简单的 user 和 item 的矩阵,如果user购买过item 则标识为1 ,否则为 0。

    1. 计算用户之间的相似度:
      相似度的计算是有很多种方法的,如何准确的计算出两个用户之间的相似度是该算法的一个最重要的环节,至于相似度的计算,网上还是有相当多的资料的,这里就不再赘述,下面我简单的列举了一些比较常用和简单的计算方式
    • 距离衡量相似度
      我们可以将每一个用户想象成特征组成的高维空间的一个点,而他们的相似度就是这两个点的距离,常用的距离公式有:欧几里得距离,曼哈顿距离,明可夫斯基距离 等
    • 余弦相似度计算法
      我们可以将每一个用户想象成特征组成的高维空间的一个点,其与 高维空间中的原点组成一个表示其的唯一向量,两个用户的相似度就可以用他们两个向量之间的夹角来确定,夹角越小,越相似
    • 其他
      可以参考一下这个文章这个文章
    • 同现度
      最后,我们再来说一个比较low,但是也简单的算法,也是本次实践的算法:同现度
      即,当两个用户同时购买了同一个商品,那么他们相似度 +1
      那么我们就可以计算出用户之间的相似度了,可以得到如下一个列表
      userABC
      A*21
      B2*2
      C12*

    这里啰嗦一下,虽然算法分简单 和 复杂,但是和算法的效果是没有绝对的关系的,所以不要小看那些简单的算法噢。

    1. 找到和推荐用户相似的用户集合 ,并推荐
      这里我们只有一个3个用户,所以我们这个集合那就定为一个吧,如果我们要给A推荐,那么先找到与A相似的用户集合 {B}

    2. 推荐
      既然我们找到了A用户的相似用户们是 B,而且也可以很简单的发现 B 买过 item3,而A没有买过,所以我们就给 A 推荐 item3

  • 总结
    基于用户的协调过滤差不多就是这个样子,当然实际生产环境你肯定得考虑很多其他因素,比如数据规模,数据特征选取,特征的权重等等等等。当然这些都不在讨论之列,我们只要知道该算法是个什么,怎么做的,有什么用就好了。最后我们再来总结下这个算法优劣吧:+

    • 因为是找用户的相似度,所以更能反映了用户所在的小型兴趣群体中物品的热门程度,比较社会化群体化。
    • 针对用户个人而言,其特征或者说兴趣是不够细化的。
    • 从实时方面来看,用户个人的行为不一定能造成物品推荐的实时更新,当然这里是不一定,很多时候,当某个热点东西进入该用户的圈子,这个东西的传递还是迅速的
    • 对于物品的冷启动比较友好,一旦一个新物品被某个用户购买,立刻就可以推荐给他圈子的其他用户
    • 对于用户的冷启动不友好,因为一个新用户的加入,并不会马上被加入到某个圈子,比较用户相似度矩阵是不可能实时计算的。
    • 推荐结果不具有可解释性,我不知道推荐给你的这个物品是什么,我只知道,你的朋友都在用
    • 对于用户比较庞大的公司,计算用户相似度会比较麻烦

好了,就说到这里吧,文中一会买,一会用,一会感兴趣,大家就别太计较了哈,理解意思就好。。。。嘿嘿嘿嘿

### 基于协同过滤的电影推荐系统实现方法 #### 协同过滤基本概念 协同过滤是一种广泛应用于推荐系统的算法,主要分为基于用户的协同过滤和基于物品的协同过滤两种方式。前者通过找到与目标用户兴趣相似的其他用户来预测评分;后者则是依据用户对特定项目的评价历史来进行推荐[^1]。 #### 算法原理及操作步骤 对于基于用户的协同过滤而言,在计算两个用户之间的相似度时通常采用余弦相似度或皮尔逊相关系数等指标。一旦确定了最相近的一组邻居,则可以利用这些邻居对该项目的打分情况加权平均得出预测分数。而对于基于物品的方法来说,则更侧重于考察各个商品间的关联程度并据此构建矩阵完成后续处理过程。 #### 数学模型与公式解析 为了量化上述提到的各种关系,研究者们提出了多种数学表达形式用于描述数据间潜在模式。例如,在衡量两部影片之间是否存在某种联系方面,可以通过统计共同观看过这两部作品的人群比例作为参考标准之一。另外还有诸如SVD(奇异值分解)、ALS(交替最小二乘法)等多种优化手段被引入进来以提高效率和准确性。 ```python import numpy as np from sklearn.metrics.pairwise import cosine_similarity def calculate_user_similarity(ratings_matrix): """ Calculate the similarity between users based on their ratings. :param ratings_matrix: A matrix where rows represent users and columns represent items, filled with rating scores. :return: Similarity matrix among all pairs of users. """ user_similarities = cosine_similarity(ratings_matrix) return user_similarities ``` #### 开发环境搭建指南 当准备动手实践这套方案之前,确保安装好必要的软件包如NumPy、Pandas以及Scikit-Learn等工具库可以帮助简化编程工作量。此外还需要准备好Movielens这样的公开可用的数据集以便测试验证自己的想法是否可行[^2]。 #### 深度学习增强版——神经协同过滤 近年来随着人工智能领域内新技术不断涌现,人们也开始尝试将深度学习融入传统CF框架之中形成所谓的NCF (Neural Collaborative Filtering),它能够自动挖掘特征表示从而进一步提升性能表现。具体做法是在原有基础上加入多层感知机(MLP)组件负责捕捉复杂交互作用,并借助反向传播调整参数直至收敛得到最优解。 ```python import torch import torch.nn as nn import torch.optim as optim class NCF(nn.Module): def __init__(self, num_users, num_items, embedding_dim=8): super(NCF, self).__init__() self.user_embedding = nn.Embedding(num_embeddings=num_users, embedding_dim=embedding_dim) self.item_embedding = nn.Embedding(num_embeddings=num_items, embedding_dim=embedding_dim) self.mlp_layers = nn.Sequential( nn.Linear(embedding_dim * 2, 64), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(64, 32), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(32, 16), nn.ReLU() ) self.output_layer = nn.Linear(in_features=16, out_features=1) def forward(self, user_indices, item_indices): user_vector = self.user_embedding(user_indices).squeeze(dim=-1) item_vector = self.item_embedding(item_indices).squeeze(dim=-1) vector = torch.cat([user_vector, item_vector], dim=-1) output = self.mlp_layers(vector) logits = self.output_layer(output) return logits.view(-1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值