此博客为本人学习笔记, 主要是通过学习王喆老师的《深度学习推荐系统》极客课程时所做的一些笔记 同时参考了文章https://zhongqiang.blog.csdn.net/article/details/107891787 和 bilibili课程
在介绍协同过滤算法前我们需要先说一下推荐系统推荐系统解决的问题是什么?
随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:
推荐系统解决的问题就是, 在“信息过载”的情况下,用户如何高效获取感兴趣的信息。
一方面要帮助信息消费者发现对自己有价值的信息,一方面要让信息生产者的生产的信息能够展现在对它感兴趣的用户前面。
从推荐系统的根本问题出发,我们可以清楚地知道,推荐系统要处理的其实是“人”和“信息”之间的关系问题。也就是基于“人”和“信息”,构建出一个找寻感兴趣“信息”的方法。 所以我们抽象出了问题中的非常重要的3个关键项:
(1) 物品信息(Item)
“信息”在不同场景下的具体含义也千差万别。比如说,在商品推荐中指的是“商品信息”,在视频推荐中指的是“视频信息”,在新闻推荐中指的是“新闻信息”,为了方便,我们可以把它们统称为“物品信息”。
(2) 用户信息(User)
从“人”的角度出发,为了更可靠地推测出“人”的兴趣点,推荐系统希望能利用大量与“人”相关的信息,这类信息包括历史行为、人口属性、关系网络等,它们可以被统称为“用户信息”。
(3) 上下文信息(Context)
在具体的推荐场景中,用户的最终选择一般会受时间、地点、用户的状态等一系列环境信息的影响,这些环境信息又可以被称为“场景信息”或“上下文信息”。
基于抽象出的3个关键项我们定义出了推荐系统的逻辑架构, 如下图
所以用一句话来说, 推荐系统要做的事情就是定义一个“函数”, 这个函数可以表达出什么样的人,在什么场景下对什么物品感兴趣, 而定义函数的方法我们一般称之为“推荐算法”。
协同过滤(Collaborative Filtering)算法是一种经典的“推荐算法”, 基本思想是根据用户之前的喜好以及其他兴趣相近的用户的选择 来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐), 一般是仅仅基于用户的行为数据(评价、购买、下载等), 而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等)。目前应用比较广泛的协同过滤算法是基于邻域的方法, 而这种方法主要有 下面两种算法:
基于用户的协同过滤(UserCF)可以追溯到1993年, 可以说是非常早的一种算法了, 这种算法的思想其实比较简单, 当一个用户A需要个性化推荐的时候, 我们可以先找到和她有相似兴趣的其他用户, 然后把那些用户喜欢的, 而用户A没有听说过的物品推荐给A。
基于用户的协同过滤算法主要包括两个步骤:
基于物品的协同过滤(ItemCF)的基本思想是预先根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品相类似的物品推荐给用户。比如物品a和c非常相似,因为喜欢a的用户同时也喜欢c,而用户A喜欢a,所以把c推荐给用户A。ItemCF算法并不利用物品的内容属性计算物品之间的相似度, 主要通过分析用户的行为记录计算物品之间的相似度, 该算法认为, 物品a和物品c具有很大的相似度是因为喜欢物品a的用户大都喜欢物品c。
基于物品的协同过滤算法主要分为两步:
相似度就是比较两个事物的相似性。一般通过计算事物的特征之间的距离,如果距离小,那么相似度大;如果距离大,那么相似度小。
这里举例说明一下集中常见的相似度计算方法:
一般情况下, 我们都是需要对数据进行归一化处理, 以消除指标之间的量纲影响, 所以大部分协同过滤大部分场景
我们只需要使用欧式距离或者余弦相似度就行。
使用时只要知道欧式距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异便可。具体问题需要具体分析,举例来说
(1) 如果要统计两部剧的用户观看行为,用户A的观看向量(0,1), 用户B为(1,0), 此时二者的余弦距离很大,而欧式距离很小。我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当用余弦距离。
(2)当我们分析用户活跃度,以登录次数和平均观看时长作为特征时, 余弦距离会认为(1,10)和(10,100)两个用户距离很近,但显然这两个用户活跃度是有着极大差异的。此时我们关注的是数值绝对差异,应当使用欧式距离。
UserCF | ItemCF | |
---|---|---|
性能 | 适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大 | 适用于物品数明显小于用户数的场合,如果物品很多,物品相似度矩阵会非常巨大 |
适用领域 | 适用于时效性较强,用户个性化兴趣不太明显的领域 | 适用于长尾物品丰富,用户个性化比较强烈的领域 |
实时性 | 用户有新行为,不一定会造成推荐结果的变化 | 用户有新行为,一定会导致推荐结果的变化 |
冷启动 | 在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品 | 新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户但没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户 |
推荐理由 | 很难提供令用户信服的推荐解释 | 利用用户的历史行为给用户做推荐解释,可以令用户比较信服 |
如果想知道Alice对物品5打多少分?
使用numpy可以很容易地把相似度矩阵算出来
import numpy as np
import pandas as pd
# items[i] 对应物品i+1, 其中i=0,1,2,3, 4
items = np.array([
[3, 4, 3, 1],
[1, 3, 3, 5],
[2, 4, 1, 5],
[3, 3, 5, 2],
[3, 5, 4, 1]]
)
cols = ['item' + str(idx) for idx in range(1, 6)]
pd.DataFrame(data=np.corrcoef(items), columns=cols, index=cols)
通过第一步计算的相似度矩阵我们可以发现物品5和物品1, 4 比较相似
一般我们会利用用户相似度和相似用户的评价加权平均获得用户的评价预测, 也就是公式:
但是不同的人对物品的评价偏好不一样, 有的人喜欢给高分,有的人喜欢给低分。对于这种有明显用户评分偏的情况, 我们需要物品的评分与此用户的所有评分的差值进行加权平均的方式来消除掉, 也就是公式:
物品5和物品1, 4的相似度为0.97和0.58, 物品1, 4的平均评分为16/5=3.2和17/5=3.4, 物品5的平均评分为13/4=3.25
代入公式可以计算出:
import numpy as np
import pandas as pd
# items[i] 对应物品i+1, 其中i=0,1,2,3, 4
users = np.array([
[3, 1, 2, 3,],
[4, 3, 4, 3,],
[3, 3, 1, 5,],
[1, 5, 5, 2,],
[5, 3, 4, 4]]
)
cols = ['user' + str(idx) for idx in range(1, 6)]
pd.DataFrame(data=np.corrcoef(users), columns=cols, index=cols)
最近的2个用户是用户1,2, 他们给物品5的打分是3分和5分
用户5和用户1, 2的相似度为0.85和0.71, 用户1, 2的平均评分为12/5=2.4和19/5=3.8, 用户5的平均评分为16/4=4
代入公式就可以得出Alice可能给的评分为
这篇文章的主要分析和介绍了协同过滤算法的基本原理,这个算法虽然比较古老了, 但是思想和原理还是值得我们研究研究的,毕竟这个算法不依赖于任何物品本身或者用户自身的属性, 而仅仅靠用户和物品的交互信息就可以完成推荐任务。它的模型通用性强,可解释强, 不需要太多对应数据领域的专业知识,工程实现简单,效果也不错这也正是它早期流行的原因。同时作为使用较早的一种经典的推荐算法, 它对后面其他传统模型算法的演化和深度模型算法的演化都有启下的作用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。