我正在研究一种算法,以便为您可以查看餐馆的平台生成推荐。因此,数据库存在3个表,“用户”,“餐馆”和“评论”。评论的评分为1-5。每个餐厅都可以有多个评论,用户可以有多个评论。评论只能有1个用户和1个餐厅。
首先,我将解释我目前的研究/结论
我已经实现了大部分基于用户的系统,但是我遇到了一些产生推荐的问题。
首先,数据稀疏性问题,因为用户可能会对非常不同的餐馆进行一些评论,因此很难确定用户之间的相关性。
其次我遇到了冷启动问题。在能够计算用户之间的相关性之前,对于完全相同的餐厅,每次评论需要大约4次评论 我通过使用基于内容的过滤器为此找到了“解决方案”。当有更好的解决方案时(例如,基于项目的过滤),我个人不喜欢这种过滤方法
最后,可伸缩性问题。因为(希望)该应用程序将取得巨大成功,所以为每个用户计算这些相关性的性能将非常沉重。
由于这些问题,我决定对基于项目的过滤器进行一些研究。我想要一些反馈,以确保我的建议是正确的,并确保我理解这是如何完全的。
首先,您必须根据所述餐厅的评论计算餐馆之间的相似性相关性。
矩阵示例(如果我是正确的)其中R1 =餐厅1等
| R1 | R2 | R3 | R4 |
R1 | 1 | 0.75 | 0.64 | 0.23 |
R2 | 0.75 | 1 | 0.45 | 0.98 |
R3 | 0.64 | 0.45 | 1 | 0.36 |
R4 | 0.23 | 0.98 | 0.36 | 1 |
要为用户生成推荐内容,您必须创建用户已正确审核的餐馆列表 然后检查矩阵以查看哪些餐馆与这些餐馆相似 在此之后,您必须检查用户尚未查看过哪些餐厅。这些将是对用户的推荐。
使用基于项目的过滤器可以解决使用基于用户的过滤器时遇到的大多数问题。
数据稀疏性。因为您不再依赖类似用户,所以您不会遇到“评论不够”的问题。
冷启动问题。因为您可以根据用户的1次审核建立您的建议,所以您不会遇到冷启动问题(除了有关于用户的空数据)
可扩展性。您不必经常生成相似性矩阵。你可以每天或甚至一周做一次。要生成建议,您只需查阅矩阵并从中检索餐馆。
现在我的问题:
我真的很想听些意见。我不是说我的任何研究都是事实,我只是想知道我是否正确地做事。
我做的一切都正确吗?我做了大量的研究,但由于每种情况都不同,我发现很难确定我做的是否正确。
基于项目的过滤器是否比基于用户的过滤器好得多?
你究竟如何计算餐馆之间的相似性?我理解矢量之间的角度,但是你如何确定矢量上的点?你不能只是评论并把它们放在其他评论中,因为那时所有评价最高的餐厅都会非常相似。你如何设置这些载体?
在我的场景中,什么是最佳解决方案,哪种相似系数最好?
此外,当我的评论矩阵看起来像这样时会发生什么?
| R1 | R2 |
User 1 | ? | 5 |
User 2 | ? | 3 |
User 3 | 5 | ? |
User 4 | 3 | ? |
可以计算这两家餐馆之间的相似度吗?如果没有,我该如何解决?
对此的任何反馈都将非常感谢!
答案 0 :(得分:1)
你看起来对你有正确的问题,我会尽量给你一些指示和一些建议:
冷启动:
您将无法解决冷启动问题。期。你只能缓解它,物品到物品方法的冷启动较少,但你仍然需要餐馆有一些评论和用户至少有一个。
如果您需要访问有关用户和餐馆的内容信息,那么请利用它来为您提供足够的数据时提供建议。
这让我有了一个有趣的见解。您无需使用相同的算法来提出所有建议。您可以为具有不同数据量的用户指定不同的方法。
例如,如果您有位置,可以先向当地用户推荐当地最受欢迎的餐厅,否则只需使用数据库中最受欢迎的餐厅。
项目2项目与用户2用户与其他东西:
I2I和U2U协同过滤是推荐系统算法,已经取得了很好的效果,但是它们遇到了您提到的所有问题。 I2I通常表现更好,但也有冷启动,可扩展性和其他问题。
还有另一类算法优于I2I和U2U,并且也基于使用评论确定要推荐的项目的相同直觉。 矩阵分解算法尝试用隐藏因素表示用户和项目信息,并根据这些因素提出建议。你应该进一步调查它。
相似度计算:
起点肯定是余弦相似度,其中代表餐馆的每个向量是一个数组,其中包含该餐厅所有用户的评论,当用户未查看餐厅时为0。
详细解释示例here。
<强>规范化:强>
即使I2I更好地扩展,但对于内存和计算要求,它仍然是餐馆数量的二次方。 因此,您应该调查其他选项,例如使用 Local Sensitive Hashing 来计算相似性。我不会详细介绍,因为我对该算法不是很舒服,但我认为你可以应用它来计算最相似的对,而不必存储整个矩阵。
进一步调查的来源: