计算相关性/加权算术平均 SQL
Posted
技术标签:
【中文标题】计算相关性/加权算术平均 SQL【英文标题】:Count relevance/weighted arithmetic mean SQL 【发布时间】:2021-09-15 13:42:47 【问题描述】:我有一张电影表和一张评论表
在我的应用中,我想展示任何类型的前 10 部电影。
我显然不能仅按评分对电影进行排序,因为有些电影只有 1 个 5 星评价,因此只会向用户推荐不相关的电影。
目前我从 DB 收到按评论排序的该类型的前 100 部电影,按服务器上的评分排序此列表,然后才显示前 10。
这有点工作,但这种解决方案在例如的情况下是不切实际的。评论轰炸,此外,前10名的目的是推荐最相关的电影。
我的想法是在电影表中添加相关性列,但我不知道如何计算它:
-
(5 星评论数量 * 5)+(4 星评论数量 * 4)等等 - 否
(5 星评论数量 * 1)+(4 星评论数量 * 0.8)+ ... +(0 星评论数量 * 0.1) - 否
评论总数/平均 - 否
((5 星评论数量 * 5 ) + (4 星评论数量 * 4 ) 等等) / 总评论数量 - mb,我不确定 0 是多少
此外,评分中的评分不是实数。用户只能给出 5、4.5、4 等分数审查。但是用户可以给电影评分 5、4.9、4.8 ... 0.1 的情况呢?
那么,如何更好地执行这个操作呢?
[Upd] 我认为不是除法。我们应该将averagerating
和reviews
与movies
相乘以计算相关性(averagerating
和reviews
已经在每次插入/删除/更新时自动更新)。我们也应该尝试标准化产品。
在这种情况下,有 100 条评论的 5 和 averagerating
的 5 的电影不会击败有 averagerating
3.8 但有 57k 条评论的电影,并且评论轰炸的问题也将得到解决。
谁能证明我的猜测?
【问题讨论】:
您可以将所有评分相加,然后除以该电影的评分总数,即平均评分。您所说的收视率不是实数是什么意思? 4.5 在我看来是一个实数 @Etienne 在我看来,它不会正常工作。如果您建议select sum(rating) group by movie_id
,然后将其除以reviews
和movies
(平均和评论会在每次插入/删除/更新时自动更新),那么您会出现这样的情况:电影的评论为((50 *5)+(40*4)+(60*3)+(50*2)+(10*1))/(50+40+60+50+10) 将与带有评论的电影具有相同的相关性((500*5)+(400*4)+(600*3)+(500*2)+(100*1))/(500+400+600+500+100)。什么不是真的。第一部电影被评为 210 次,第二部被评为 2100 次
@Etienne 真实/非真实怎么样,我的意思是可能的评论数量是离散的所以集合是有限的。我的错。在 5, 4.9, 4.8 ... 0.1 的情况下,它也是有限的,但很难计算每个成员,而且集合可以是无限的 - 实数,我的情况是什么,但即使在这种情况下,这个公式也应该适用
@Etienne 回到我的第一条评论,这种方法并不能解决零问题。无论有多少用户将电影评分为 0,所有零都将被忽略
如果您询问如何根据评分数量和评分值定义可靠/相关评分,那么这是一个统计问题,您需要询问统计论坛。如果您已经定义了逻辑但想知道如何对其进行编码,请将该逻辑添加到您的问题中
【参考方案1】:
我同意 @NickW 的观点,即这更像是一个统计问题而不是编程问题,但无论如何我都会尝试回答。
如果您想同时考虑平均评分和评分数,一种简单的方法是将两者相乘。这为您提供了所有评级的总和,但是,正如@qwezxc789 所指出的,这并没有考虑零评级的数量。另一种策略可以是avgrating
和reviews
的线性组合。共线性应该不是问题,因为这两个变量都不依赖于另一个变量。您甚至可以使用线性系数来改变每个变量的相对贡献。此解决方案很容易推广到 n 个自变量。
令wi为预测器i的权重,1≤i≤n, w1 + ... + wn = 1(或任何其他常数,但为什么不使用 1?)。
您可以使用以下 SQL 将此值添加为 movies
表中的新 relevance
列。我使用了两个同等权重的预测变量:ratings
和 reviews
。
ALTER TABLE movies ADD [relevance] AS
(SELECT 0.5 * avgrating + 0.5 * reviews
FROM movies)
【讨论】:
以上是关于计算相关性/加权算术平均 SQL的主要内容,如果未能解决你的问题,请参考以下文章