书店应用推荐系统


问题内容

嗨,我正在尝试学习一些在Amazon.com之类的网站中使用的推荐算法。因此,我有一个简单的Java(Spring Hibernate
Postgres)书店应用程序,在Book中,该书店具有标题,类别,标签,作者等属性。为简单起见,书中没有内容。必须通过书名,类别,作者和标签来识别一本书。对于每个登录到该应用程序的用户,我应该可以推荐一些书籍。每个用户都可以查看一本书,将其添加到购物车中并随时购买。因此,在数据库中,我存储了每个用户看书的次数,购物车中的书以及用户购买的书。目前尚无评分选项,但也可以添加。

那么有人可以告诉我,我可以使用哪些算法为每个用户演示一些书籍推荐?我想保持它非常简单。它不是要出售的项目,而只是为了扩展我对推荐算法的了解。因此,假设总共只有大约30本书(每本书5个类别,每个类别6本书)。如果有人还可以告诉我,我应该使用哪些属性来计算两个用户之间的相似度以及如何使用推荐的算法进行计算,那将非常有帮助。

提前致谢。血清素追踪。


问题答案:

作为特定的具体示例,一种选择是“最近的K邻居”算法。

为简化起见,假设您只有十本书,而您只是在跟踪每个用户查看每本书的次数。然后,对于每个用户,您可能会有一个数组int timesViewed[10],其中的值timesViewed[i]是用户查看书号的次数i

然后,您可以使用相关函数将用户与所有其他用户进行比较,例如Pearson相关。计算当前用户c与另一个用户之间的相关性,o得出的值介于-1.0和1.0之间,其中-1.0表示“该用户c与另一个用户完全相反o”,而1.0表示“该用户c与另一个用户相同o

如果计算c每个用户与另一个用户之间的corellation
,则会得到一个结果列表,该结果显示用户的观看模式与每个其他用户的观看模式有多相似。然后,您选择K(例如5、10、20)个最相似的结果(因此命名为算法),即K相关得分最接近1.0的用户。

现在,您可以对每个用户timesViewed数组进行加权平均。例如,我们要说的averageTimesViewed[0]timesViewed[0]这K个用户中每个K用户的平均值,并按其相关分数加权。然后彼此做同样的事情averageTimesViewed[i]

现在,您有了一个数组averageTimesViewed,大致来说,它包含查看方式与最相似的K位用户c查看每本书的平均次数。推荐averageTimesViewed分数最高的书,因为这是其他用户最感兴趣的书。

通常也值得将用户已经阅读过的书籍排除在推荐范围之外,但是在计算相似度/相关性时仍要考虑这些因素仍然很重要。

还要注意,可以将其扩展以考虑其他数据(例如购物车列表等)。另外,您 可以根据需要
选择所有用户(即K=用户数量),但这并不总是会产生有意义的结果,通常选择一个合理的较小K值即可获得良好的结果,并且计算速度更快。