SpringBoot 协同过滤算法分析和实践

日暮汉宫传蜡烛,轻烟散入五侯家。

1 前言

协同过滤算法是一种常用于推荐系统的技术,能够根据用户的行为和偏好,向其提供个性化的推荐内容。在当今互联网时代,个性化推荐已经成为了用户获取信息和消费产品的重要途径之一。协同过滤算法作为一种主流的推荐算法,能够根据用户的历史行为和与其他用户的关联,预测用户的偏好并向其提供个性化的推荐内容。本文将对协同过滤算法进行技术总结,旨在帮助读者更好地理解该算法的原理和应用。

2 协同过滤算法原理

协同过滤算法的基本原理是基于用户之间的相似性或项目之间的相似性,利用历史数据来进行推荐。它分为两种主要类型:基于用户的协同过滤 (User CF) 和基于物品 (Item CF) 的协同过滤。基于用户的协同过滤算法通过找到与目标用户兴趣相似的其他用户,来进行推荐。基于项目的协同过滤算法则是根据项目的相似性,向用户推荐与其历史偏好相似的商品。协同过滤算法在电子商务、社交媒体、电影和音乐推荐、新闻推荐、旅游推荐等领域有着广泛的应用。

基于用户推荐的示意图如下: 基于物品推荐示意图如下:

UserCF和ItemCF的对比

事项 用户推荐 UserCF 物品推荐 ItemCF
场景 适用于用户较少的场合,如果用户较多,用户相似度矩阵计算量很大 适用于物品明显少于用户的场景,物品较多会导致计算物品相似度矩阵难度加大
领域 时效性较强,用户个性化兴趣不太明显的领域,强调人与人之间的共性、 长尾物品丰富,用户个性化需求强烈的领域,强调人的个性
实时性 在用户有新行为,推荐结果不会立即变化 用户有新行为会导致推荐结果的实时变化
冷启动 在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是定时离线计算的 新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品
新物品 新物品上线一段时间后,如果有用户对物品产生行为,就可以推荐给和对它产生行为的用户兴趣相似的其他用户 新物品跟其他物品的相似度还没有计算,没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户
推荐理由 很难提供令用户信服的推荐解释 利用用户的历史行为给用户做推荐解释,可以令用户比较信服

3 协同过滤算法实现过程分析

如下表所示,是一组关注对电影的打分数据,数据已经做了归一化处理,展现的方式就是矩阵:

选用皮尔逊相关相似来计算,具体公式如下(Pearson相关系数),实际上来说皮尔逊相关系数就是余弦相似度计算之前两个向量都先进行中心化(centered)。

两个连续变量(X,Y)的皮尔逊相关系数等于他们之间的协方差cov(X,Y)除以它们各自标准差的乘积(𝜎xσx,𝜎𝑌σY),系数的取值总是在-1.0到1.0之间,接近0的变量被成为无相关性,接近1被称为具有强正相关性,接近-1被称为具有强负相关性。

我们选《墨攻》(X)和《英雄》(Y)作为例子,来算一下相似度,则

java 复制代码
       X=(3.5,5.0,3.0)
       Y=(3.0,3.5,2.0)

数字就是评分,因为只有三个人同时看了这两个电影,所以X,Y两个向量都只有三个元素。按照公式逐步计算:

java 复制代码
    1.  x和y的乘积再求和:3.5×3.0+5.0×3.5+3.0×2.0 = 34
    2.  x求和乘以y求和,再除以个数:((3.5+5.0+3.0)×(3.0+3.5+2.0))/ 3 = 32.58
    3.  x的平方和:3.5^2+5.0^2+3.0^2 = 46.25
    4.  x和的平方除以个数:((3.5+5.0+3.0)^2)) / 3 = 44.08
    5.  y的平方和:3.0^2+3.5^2+2.0^2 = 25.25
    6.  y和的平方除以个数:((3.0+3.5+2.0)^2)) / 3 = 24.08

最终,我们带入公式,可以计算出 墨攻和英雄两部电影之间的相关系数为 0.89。

1、基于用户的协同过滤推荐,要找出兴趣爱好相似的人来推荐,下表是基于用户计算的相关系数:

2、基于物品的协同过滤推荐,要找出与自己喜欢的物品相似的物品来推荐,下图是基于物品计算的相关系数:

关于以上的计算逻辑 1 数据准备 2 相似度计算 3 计算结果

基于以上的相似度,就可以为用户推荐相关的物品。

4 协同过滤算法优势和缺点

协同过滤算法具有以下优势:

  • 简单有效:协同过滤算法的原理相对简单,容易理解和实现。
  • 个性化推荐:协同过滤算法能够根据用户的个性化需求和偏好,为其提供定制化的推荐内容。
  • 可扩展性:协同过滤算法适用于大规模数据集,可以处理数以百万计的用户和项目。

协同过滤算法有以下的劣势:

  • 冷启动问题:对于新用户或新项目,缺乏足够的历史数据,导致难以准确推荐。
  • 数据稀疏性:在大规模数据集中,用户和项目之间的交互数据往往是稀疏的,这会影响算法的准确性和推荐效果。
  • 算法偏好倾向:协同过滤算法容易出现算法偏好,即只推荐用户过去喜欢的内容,忽视其他潜在的兴趣。
  • 简单相似性度量:协同过滤算法通常使用简单的相似性度量方法,如余弦相似度或皮尔逊相关系数。这些方法忽略了一些特征之间的复杂关系,无法捕捉到更深层次的用户或项目之间的相似性。因此,推荐结果可能不够准确或个性化。
  • 系统可扩展性:随着用户和项目数量的增加,协同过滤算法的计算复杂度会增加。对于大规模数据集,需要处理数以百万计的用户和项目,算法的计算和存储开销可能变得很高,限制了系统的可扩展性和效率。

5 算法实践

对于协同推荐算法,作者进行了大量的尝试,其中最大的困惑在于不能够推荐出物品,这有以下几个原因:

  • 1 数据的样本太小
  • 2 数据的相关性需要在造数据时就给定一些初始导向。
  • 3 参数的设置不合理。

需要用到的依赖如下:

xml 复制代码
<!-- mahout-core -->
<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-core</artifactId>
    <version>0.9</version>
</dependency>

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-collections</artifactId>
    <version>1.0</version>
</dependency>

<!-- mahout-math -->
<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-math</artifactId>
    <version>0.9</version>
</dependency>

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-examples</artifactId>
    <version>0.11.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

1 一些用到的工具类

2 数据制造 3 基于物品推荐和用户推荐的模型 4 基于用户推荐

5 基于物品推荐

6 数据运行结果

6 总结

在本文中,介绍了协同推荐算法的相关原理和实践,在文末也进行的代码的演示,相关的代码已经上传导 github, 欢迎 star 并研究。项目 github 地址 springboot-auth

相关推荐
wn5319 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
bjzhang7520 分钟前
SpringBoot开发——集成Tess4j实现OCR图像文字识别
spring boot·ocr·tess4j
flying jiang25 分钟前
Spring Boot 入门面试五道题
spring boot
小菜yh26 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
希冀12333 分钟前
【操作系统】1.2操作系统的发展与分类
后端
GoppViper1 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
爱上语文2 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
荆州克莱2 小时前
springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结
spring boot·spring·spring cloud·css3·技术
serve the people2 小时前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
罗政8 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端