我正在寻找一种基于'views'和'likes'计算的流行度算法。
似乎答案是使用 Bernoulli参数的威尔逊得分置信区间的下限,此处提供算法:
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
该页面上的算法以多种形式提供 - 数学公式,Ruby和SQL。
我需要一个SQL版本,不幸的是,该网站上提供的SQL表单与其他两个版本不同,它似乎在正面和否定投票上进行计算,而Ruby版本只需要pos
个正投票数和n
总投票数。
我正在寻找一个基于正投票计算的SQL语句(Postgres兼容),我会将'views'计为我的n
总投票数。
(我确实认为我可以在他们的SQL中将positive + negative
视为n
,但后来我对如何处理SQRT((positive * negative) / (positive + negative) + 0.9604)
感到困惑。
答案 0 :(得分:4)
“算法”只是采用比率置信区间的下限。
如果您只有正面投票,那么只需使用正面投票数。你所提到的目的是平衡正面投票,反对票和总投票。你不需要任何这样的平衡,因为正面投票=总票数。
如果您有总票数和肯定票数,那么您可以使用:
SELECT widget_id, ((positive + 1.9208) / (positive + negative) -
1.96 * SQRT((positive * negative) / (positive + negative) + 0.9604) /
(positive + negative)) / (1 + 3.8416 / (positive + negative))
AS ci_lower_bound
FROM (select w.*, (total - positive) as negative
from widgets w
)
WHERE positive + negative > 0
ORDER BY ci_lower_bound DESC;
顺便说一下,我不确定威尔逊修正是否比正分数的一个标准偏差下限给出了更好的结果:
SELECT widget_id, positive/total - sqrt(positive*negative/total)/total