计数relevance/weighted算术平均值SQL

Count relevance/weighted arithmetic mean SQL

我有 table 部电影和 table 评论

在我的应用中,我想显示任何类型的前 10 部电影。

我显然不能仅按评分对电影进行排序,因为有些电影只有 1 个 5 星评论,因此只会向用户推荐不相关的电影。

目前我从 DB 收到按评论排序的该类型的前 100 部电影,按服务器上的评分排序此列表,然后才显示前 10 名。

这有点管用,但这种解决方案在某些情况下是不切实际的。评论轰炸,而且,前10名列表的目的是推荐最​​相关的电影。

我的想法是在电影中添加相关性列table但我不知道如何计算它:

  1. (5 星评论的数量 * 5 )+(4 星评论的数量 * 4 )等等 - 否
  2. (5 星评论数量 * 1)+(4 星评论数量 * 0.8)+ ... +(0 星评论数量 * 0.1)- 否
  3. 评论总数/平均 - 否
  4. ((5 星评论的数量 * 5 ) + (4 星评论的数量 * 4 ) 等等) / 评论总数 - mb,我不确定 0

另外,ratings中的rating不是实数。用户只能给出 5、4.5、4 等评分评价。但是如果用户可以对电影进行 5、4.9、4.8 ... 0.1 的评分呢?

那么,如何更好地执行此操作?

[Upd] 我认为不是分裂。我们应该从 movies 中乘以 averageratingreviews 以计算相关性(averageratingreviews 已经在每个 insert/delete/update 上自动更新) .我们也应该尝试使产品正常化。

在这种情况下,有 100 条评论的 5 和 averagerating 的 5 的电影不会打败 averagerating 3.8 的电影,但有 57k 条评论,评论轰炸的问题也将得到解决。

谁能证明我的猜测?

我同意@NickW 的观点,这更像是一个统计问题而不是编程问题,但无论如何我都会尝试回答它。

如果您想同时考虑平均评分和评分数量,一个简单的方法是将两者相乘。这为您提供了所有评分的总和,但是,正如@qwezxc789 指出的那样,这并未考虑零评分的数量。另一种策略可以是 avgratingreviews 的线性组合。共线性不应该成为问题,因为两个变量都不依赖于另一个。您甚至可以使用线性系数来改变每个变量的相对贡献。这个解决方案很容易推广到 n 个自变量。

wi为预测变量i的权重,1≤in, w1 + ... + wn = 1(或任何其他常量,但为什么不使用 1?)。

您可以使用以下 SQL 将此值添加为 movies table 中的新 relevance 列。我使用两个等权重的预测变量:ratingsreviews.

ALTER TABLE movies ADD [relevance] AS
(SELECT 0.5 * avgrating + 0.5 * reviews
FROM movies)