今日头条【推荐系统算法之 surprise 实战】

3,986 阅读3分钟
原文链接: m.toutiao11.com

推荐系统算法之 surprise 实战

图片来自Overview of Recommender Algorithms

上一篇推荐系统之用户行为分析介绍了一些基本推荐算法,本文将通过 surprise 库来深入分析这些算法。

NormalPredictor

第一种预测方法是假设评分数据来自于一个正态分布,下面对这个问题进行建模。

问题:若给定一组样本 x 1 ,x 2 …x n ,已知它们来自于 高斯分布 N(μ,σ),试估计参数μ,σ。

高斯分布的概率密度函数:

推荐系统算法之 surprise 实战

将 X i 的样本值 x i 带入,得到:

推荐系统算法之 surprise 实战

我们将 L(x) 求 log,并且化简式子:

推荐系统算法之 surprise 实战

最后我们对式子求导求,就能得到μ,σ:

推荐系统算法之 surprise 实战

看代码:

推荐系统算法之 surprise 实战

BaselineOnly

第二个算法是根据 Factor in the neighbors: scalable and accurate collaborative filtering 所得到,算法发现传统 CF 方法的一些问题:

  • 不同 item 的评分不同

  • 不同用户的评分也不同

  • 评分随着时间一直在变化

于是提出了下面的 baseline model:

推荐系统算法之 surprise 实战

其中 u 是平均得分,bu 是用户的偏置,bi 是 item 的偏置,等价于求下面的极值问题:

推荐系统算法之 surprise 实战

可以求得下面的 bu 和 bi:

推荐系统算法之 surprise 实战

我们可以再看 surprise 中代码,里面的实现是:

推荐系统算法之 surprise 实战

运行代码可得:

推荐系统算法之 surprise 实战

可以发现结果是好于 NormalPredictor 的。

KNNBasic

KNNBasic 是基本的 CF 算法,user-based 或者 item-based

推荐系统算法之 surprise 实战

计算 user-user 的相似性,或者计算 item-item 的相似性。

推荐系统算法之 surprise 实战

可以看到这个结果略差于 BaselineOnly

KNNWithMeans

KNNWithMeans 基于的一个假设也是用户和 item 的评分有高低,去除一个平均值后再计算。

推荐系统算法之 surprise 实战

通过均值的方法来计算结果略优于 KNNBasic

推荐系统算法之 surprise 实战

KNNBaseline

KNNBaseline 是在 KNNWithMeans 基础上,用 baseline 的值来替换均值,计算公式如下:

推荐系统算法之 surprise 实战

可以看到使用 KNNBaseline 方法是目前最好的结果。

推荐系统算法之 surprise 实战

SVD

从这个算法开始是使用矩阵分解算法来做了,先是最基本的 svd 方法。

先定义预估值:

推荐系统算法之 surprise 实战

在定义 loss

推荐系统算法之 surprise 实战

最后是更新方式:

推荐系统算法之 surprise 实战

其中 eui 是残差

推荐系统算法之 surprise 实战

推荐系统算法之 surprise 实战

核心代码:

推荐系统算法之 surprise 实战

svd++

预测的精度不仅要考虑显示的反馈,也需要考虑一些隐反馈

  • 显性反馈行为包括用户明确表示对物品喜好的行为:主要方式就是评分和喜欢 / 不喜欢;

  • 隐性反馈行为指的是那些不能明确反应用户喜好的行为:最具代表性的隐性反馈行为就是页面浏览行为;

更详细的内容可以看之前的文章推荐系统之用户行为分析。

将这种隐反馈考虑进来,特别适合当一直浏览,但是不怎么进行评价的用户。

此时我们建模得到下面的式子:

推荐系统算法之 surprise 实战

其中 R(u) 是用户 u 有隐性行为的 item 集合,y 则是对 item 隐性行为的向量建模,如果用户有多个隐性行为,我们同样可以再加上一个隐向量:

推荐系统算法之 surprise 实战

此时参数更新方法:

推荐系统算法之 surprise 实战

代码实现:

推荐系统算法之 surprise 实战

代码执行效果:

推荐系统算法之 surprise 实战

NMF

非负矩阵分解(NMF)和 svd 都是做矩阵分解,不多做解释,看代码执行效果:

推荐系统算法之 surprise 实战

总结

本文通过 surprise 中的方法介绍了两大类推荐算法:隐语义模型和基于邻域的算法,下一篇文章将介绍一些基于神经网络的推荐算法,尽请期待。