贝叶斯公式sql:带权重的评级系统
bayesan formula sql: rating system with weight
今天我发布了 a question if bayesan 对我来说是一个很好的方法来进行评级系统权重。因为我没有得到答案,所以我尝试自己实现。
在我的数据库中,用户可以为每个组添加 1 到 5 星的投票。然后我必须通过这些选票显示排行榜。到目前为止,我一直在做的是在没有权重的情况下按平均票数对它们进行排序。这不太好,因为一个拥有 5.0 票和 20 票的小组排在平均 4.9 票和 10000 票的小组之前。
这是我的 table:
CREATE TABLE IF NOT EXISTS votes(
user_id BIGINT,
group_id BIGINT,
vote SMALLINT,
vote_date timestamp,
PRIMARY KEY (user_id, group_id)
这是我尝试进行的查询,它似乎有效:
SELECT
v.group_id,
s_ref.title,
s_ref.username,
COUNT(vote) AS amount,
ROUND(AVG(vote), 1)::float AS average,
-- (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
( (COUNT(vote)::float / (COUNT(vote)+10)) * AVG(vote)::float + (10::float / (COUNT(vote)+10)) * 4 ) AS bayesan,
RANK() OVER (PARTITION BY s.lang ORDER BY( (COUNT(vote)::float / (COUNT(vote)+10)) * AVG(vote)::float + (10::float / (COUNT(vote)+10)) * 4 ) DESC)
FROM votes AS v
LEFT OUTER JOIN supergroups_ref AS s_ref
ON s_ref.group_id = v.group_id
LEFT OUTER JOIN supergroups AS s
ON s.group_id = v.group_id
GROUP BY v.group_id, s_ref.title, s_ref.username, s.nsfw, s.banned_until, s.lang, s.category, s.bot_inside
HAVING
(s.banned_until IS NULL OR s.banned_until < now())
AND COUNT(vote) >= 10
AND s.bot_inside IS TRUE;
但我只遗漏了一件事(我希望):查询中贝叶斯公式中的 4 只是一个假值,因为读到这里我还没有理解 what is mean with 'C'。你能告诉我应该在 c 中添加什么吗?
在 Google'ing 贝叶斯估计之后,转到维基百科页面,阅读一点,然后转到名为 "Practical example of Bayes estimators" 的部分,它指出
where W is the weighted rating and C is the average rating of all
films
所以这很可能对您来说意味着它是一个平均值 vote/rating,无论组别如何。
今天我发布了 a question if bayesan 对我来说是一个很好的方法来进行评级系统权重。因为我没有得到答案,所以我尝试自己实现。
在我的数据库中,用户可以为每个组添加 1 到 5 星的投票。然后我必须通过这些选票显示排行榜。到目前为止,我一直在做的是在没有权重的情况下按平均票数对它们进行排序。这不太好,因为一个拥有 5.0 票和 20 票的小组排在平均 4.9 票和 10000 票的小组之前。
这是我的 table:
CREATE TABLE IF NOT EXISTS votes(
user_id BIGINT,
group_id BIGINT,
vote SMALLINT,
vote_date timestamp,
PRIMARY KEY (user_id, group_id)
这是我尝试进行的查询,它似乎有效:
SELECT
v.group_id,
s_ref.title,
s_ref.username,
COUNT(vote) AS amount,
ROUND(AVG(vote), 1)::float AS average,
-- (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
( (COUNT(vote)::float / (COUNT(vote)+10)) * AVG(vote)::float + (10::float / (COUNT(vote)+10)) * 4 ) AS bayesan,
RANK() OVER (PARTITION BY s.lang ORDER BY( (COUNT(vote)::float / (COUNT(vote)+10)) * AVG(vote)::float + (10::float / (COUNT(vote)+10)) * 4 ) DESC)
FROM votes AS v
LEFT OUTER JOIN supergroups_ref AS s_ref
ON s_ref.group_id = v.group_id
LEFT OUTER JOIN supergroups AS s
ON s.group_id = v.group_id
GROUP BY v.group_id, s_ref.title, s_ref.username, s.nsfw, s.banned_until, s.lang, s.category, s.bot_inside
HAVING
(s.banned_until IS NULL OR s.banned_until < now())
AND COUNT(vote) >= 10
AND s.bot_inside IS TRUE;
但我只遗漏了一件事(我希望):查询中贝叶斯公式中的 4 只是一个假值,因为读到这里我还没有理解 what is mean with 'C'。你能告诉我应该在 c 中添加什么吗?
在 Google'ing 贝叶斯估计之后,转到维基百科页面,阅读一点,然后转到名为 "Practical example of Bayes estimators" 的部分,它指出
where W is the weighted rating and C is the average rating of all films
所以这很可能对您来说意味着它是一个平均值 vote/rating,无论组别如何。