协同过滤和隐式评级;正常化?

机器算法验证 算法 正常化 推荐系统
2022-04-09 13:59:04

我想用用户查看一篇文章的时间作为用户喜欢这篇文章的隐含评分。

我的问题是如何规范所有用户的这些信息。

目前,我减去用户特定平均值所花费的时间,然后除以标准差。

这是正确的方法吗?似乎并非如此,因为评级仍然可以采用任何值。

也许我应该在之后将评级缩放到某个区间(如 [ - ])?110

3个回答

如果您要使用停留时间填充整个userxarticle矩阵,您将很快遇到稀疏问题。

此外,停留时间的简单平均很容易出现许多问题,例如,如果您的记录很少,或者如果一个用户的浏览器打开一个月怎么办?

步骤#1:填空

根据我处理用户停留时间的经验,花费秒查看网站的用户数量随着的增加而大大减少。tt

我发现将用户停留时间建模为指数曲线是一个很好的近似值。

使用贝叶斯方法,并使用Gamma 分布作为每个站点停留时间平均值的先验分布,我们得到一个熟悉的公式:

谐波平均值

n+mmb+1t1+++1tb

其中上花费的时间是您引入的偏差,是它的强度。tiibm

例如,设置就像假设两个虚构用户在没有该x组合的数据时浏览了一个网站 3 秒。b=3,m=2userarticle

请注意,这个公式对异常值的影响要大得多,因为它假设指数分布(而不是像算术平均值那样的高斯分布)

步骤#2:填充矩阵

时间是正数,它们有一定的合理范围(例如,最多一天)。

但是,在矩阵分解之后,任何数值都可以出现在矩阵单元格中,包括负项。

通常的做法是user填充xarticle矩阵, 其中logitsigmoid函数的倒数。

logit(t)

然后在插入用户和文章的停留时间时,我们使用:ij

sigmoid(<ui,aj>)

而不是只使用点积。

通过这种方式,我们可以确定最终结果将限制在一个有意义的范围内。

Hu、Koren 和 Volinsky 面临着类似的问题,他们在Collaborative Filtering for Implicit Feedback Datasets中提出了解决方案。他们用的例子是看电视节目的时间,但我会说阅读文章的时间。

他们的基本思想是,最重要的方面是用户是否看过一篇文章。因此,他们创建了一个包含二进制条目的矩阵,其中矩阵的每个表示用户是否查看过文章目标是尽可能地估计这个二进制条目。感觉阅读的时间长度也有一些价值,他们对矩阵的每个条目进行加权。所有条目的权重为为阅读文章所花费的时间,他们为非零条目提出了一些加权方案:(u,i)ui01rui

  1. wui=1+αrui
  2. wui=1+αlog(1+rui/ϵ)

其中是调整参数。αϵ

最后,他们使用矩阵分解技术使用平方误差损失和上面给出的权重来估计二进制条目。我在https://github.com/andland/implicitcf在 R 中有一个 Hu 等人算法的简单实现

最近,Johnson 提议在隐式反馈数据的逻辑矩阵分解中扩展这种技术。这个想法基本相同,但使用逻辑变换和负加权伯努利对数似然作为损失函数。

还有另一种不太复杂的方法来处理这个问题。但是,我认为 Uri Goren 提出的方法可能效果更好。

我使用了另一种方法来规范在文章页面上花费的时间。我将时间除以文章的字数。

另外,我通过查看平均阅读时间来设置在页面上花费的最长时间。通过将文章的长度除以某人需要阅读该文章的最长时间,设置了一个上限。以这种方式处理异常值。

我还建议使用更多隐式反馈变量,例如滚动长度。此变量可用于强制在页面上花费的时间。