学习笔记:基于模型的协同过滤推荐算法简述

一、基于模型的协同过滤推荐算法与基于邻域的算法的差异

基于邻域的协同过滤方法可以看作是KNN的泛化。主要是将所有的用户数据,读入内存,进行运算,当数据量特别大时,显然这种方法是不靠谱的。 这些方法是基于实例的方法,所以,除了可选的预处理阶段之外,没有专门为预测提前创建模型。

基于模型的协同过滤推荐算法,与基于近邻的推荐算法是相对的。它基于样本用户的喜好信息,依托于一些机器学习的模型,通过离线进行训练,得到一个推荐模型,然后根据实时的用户喜好的信息进行预测,在线进行推荐。

二、基于模型的协同过滤推荐算法的优势

  1. 节省空间。一般情况下,学习模型的大小比原始评分矩阵小得多。
  2. 训练与预测的速度快。基于邻域的方法的预处理阶段是用户数量或项目数量的二次方。(比较某一个 用户/项目 和其他所有的 用户/项目 , 以找到同类 用户/项目 )而基于模型的系统在建立训练模型的预处理环节需要的时间往往要少得多。
    在大多数情况下,压缩和总结模型可以被用来加快预测
  3. 避免过拟合。过度拟合是许多机器学习算法中的一个严重问题。 基于模型的方法的总结方法通常可以帮助避免过度拟合。 此外,在基于模型的方法中,可以使用正则化方法使这些模型具有鲁棒性。

三、基于模型的协同过滤与分类回归问题的联系

在基于模型的方法中,与有监督或无监督的机器学习方法一样,预先创建了从数据学习到的模型。 因此,训练(或模型构建阶段)与预测阶段明显分开。
  传统机器学习中此类方法的示例包括决策树、基于规则的方法、贝叶斯分类器、回归模型、支持向量机和神经网络 。
  有趣的是,几乎所有这些模型都可以推广到协同过滤场景,就像 k 最近邻分类器可以推广到基于邻域的模型进行协同过滤一样。
  这是因为传统的分类和回归问题是矩阵补全(或协同过滤)问题的特例。

在为协同过滤设计学习算法时,记住协同过滤问题和数据分类问题之间的相似性很有用。这是因为数据分类是一个研究比较深入的领域,分类的各种解决方案也为协同过滤算法的设计提供了重要的提示。

事实上,大多数机器学习和分类算法在协同过滤文献中都有直接的类比。以类似于分类模型的方式,可以理解协同过滤推荐系统中的大量算法。(例如,分类文献中的经典元算法,如bagging、boosting 或模型组合,可以扩展到协同过滤。)

然而,将数据分类模型直接推广到矩阵完成问题并不总是那么容易,尤其是当绝大多数条目丢失时。 此外,各种模型的相对有效性在不同的环境中是不同的。 例如,一些最近的协同过滤模型,例如潜在因子模型,特别适合协同过滤。这些模型在数据分类的背景下不被视为有竞争力的好模型。(本文为CSDN博主「UQI-LIUWJ」的原创文章 1.1小节)

四、基于模型的协同过滤算法方法分类

基于模型的协同过滤相关算法有很多,这里进行一下具体分类。我们的问题是这样的:有n个物品,n个用户的数据,但是只有部分用户和物品之间是有评分数据的,其它部分评分是空白,此时需要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。解决这个问题一般可以用机器学习的方法,具体可以使用关联算法聚类算法分类算法回归算法矩阵分解神经网络,图模型以及隐语义模型来解决。

4.1 用关联算法做协同过滤

一般我们可以找出用户购买的所有物品数据里频繁出现的项集活序列,来做频繁集挖掘,找到满足支持度阈值的关联物品的频繁N项集或者序列。如果用户购买了频繁N项集或者序列里的部分物品,那么我们可以将频繁项集或序列里的其他物品按一定的评分准则推荐给用户,这个评分准则可以包括支持度,置信度和提升度等。常用的关联推荐算法有Apriori,FP Tree和PrefixSpan。(本段摘自CSDN博主 小飞侠v科比 的文章 第3节 (下同))

4.2 用聚类算法做协同过滤

用聚类算法做协同过滤就和前面的基于用户或者项目的协同过滤有些类似了。我们可以按照用户或者按照物品基于一定的距离度量来进行聚类。如果基于用户聚类,则可以将用户按照一定距离度量方式分成不同的目标人群,将同样目标人群评分高的物品推荐给目标用户。基于物品聚类的话,则是将用户评分高物品的相似同类物品推荐给用户。常用的聚类推荐算法有K-Means, BIRCH, DBSCAN和谱聚类。

4.3 用分类算法做协同过滤

如果我们根据用户评分的高低,将分数分成几段的话,则这个问题变成分类问题。比如最直接的,设置一份评分阈值,评分高于阈值的就是推荐,评分低于阈值就是不推荐,我们将问题变成了一个二分类问题。虽然分类问题的算法多如牛毛,但是目前使用最广泛的是逻辑回归。为啥是逻辑回归而不是看起来更加高大上的比如支持向量机呢?因为逻辑回归的解释性比较强,每个物品是否推荐我们都有一个明确的概率放在这,同时可以对数据的特征做工程化,得到调优的目的。目前逻辑回归做协同过滤在BAT等大厂已经非常成熟了。常见的分类推荐算法有逻辑回归和朴素贝叶斯,两者的特点是解释性很强。

4.4用回归算法做协同过滤

用回归算法做协同过滤比分类算法看起来更加的自然。我们的评分可以是一个连续的值而不是离散的值,通过回归模型我们可以得到目标用户对某商品的预测打分。常用的回归推荐算法有Ridge回归,回归树和支持向量回归。

4.5用矩阵分解做协同过滤

矩阵分解的基本思想就是把原来的大矩阵近似的分成两个小矩阵的乘积,在推荐时不使用大矩阵参与计算,而是使用分解得到的两个小矩阵。按照矩阵分解的原理,我们会发现原来m×n的大矩阵会分解成m×k 和k×n的两个小矩阵,这里多出来一个k维向量,就是隐因子向量,类似的表达还有隐因子、隐向量、隐含特征、隐语义、隐变量等。
矩阵分解
基于矩阵分解的推荐算法的核心假设是用隐语义(隐变量)来表达用户和物品,他们的乘积就成了原始的元素。我们认为实际的交互数据是由一系列的隐变量的影响下产生的,这些隐变量代表了用户和物品一部分共有的特征,在物品身上表现为属性特征,在用户身上表现为偏好特征,只不过这些因子并不具有实际意义,也不一定具有非常好的可解释性,每一个维度也没有确定的标签名字,所以才会叫做“隐变量”。例如在推荐电影时,电影可以分为动作,喜剧,爱情等多种种类,这些分类就是电影的属性特征,同时也是用户的偏好特征,也就是“隐变量”。

而矩阵分解后得到的两个包含隐变量的小矩阵,一个代表用户的隐含特征,一个代表物品的隐含特征,矩阵的元素值代表着相应用户或物品对各项隐因子的符合程度,有正面的也有负面的,目前主流的矩阵分解推荐算法主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。

4.6 用神经网络做协同过滤

用神经网络乃至深度学习做协同过滤应该是以后的一个趋势。目前比较主流的用两层神经网络来做推荐算法的是限制玻尔兹曼机(RBM)。在目前的Netflix算法比赛中, RBM算法的表现很牛。当然如果用深层的神经网络来做协同过滤应该会更好,大厂商用深度学习的方法来做协同过滤应该是将来的一个趋势。

4.7 用图模型做协同过滤

用图模型做协同过滤,则将用户之间的相似度放到了一个图模型里面去考虑,常用的算法是SimRank系列算法和马尔科夫模型算法。对于SimRank系列算法,它的基本思想是被相似对象引用的两个对象也具有相似性。算法思想有点类似于大名鼎鼎的PageRank。而马尔科夫模型算法当然是基于马尔科夫链了,它的基本思想是基于传导性来找出普通距离度量算法难以找出的相似性。

4.8 用隐语义模型做协同过滤

隐语义模型主要是基于NLP的,涉及到对用户行为的语义分析来做评分推荐,主要方法有隐性语义分析LSA和隐含狄利克雷分布LDA。

(学习时摘抄了几位大佬的文章,纯粹是自学使用的,感谢各位大佬的分享)

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值