代码之家  ›  专栏  ›  技术社区  ›  91DarioDev

bayesan公式sql:带权重的评级系统

  •  -1
  • 91DarioDev  · 技术社区  · 8 年前

    今天我发布了 a question 如果 bayesan 在我的案例中,这是一个很好的方法来做评分系统权重。由于我没有得到答案,我试图实现如果我自己。

    在我的数据库中,用户可以为每个组添加1到5颗星的投票。然后,我必须根据这些选票显示排行榜。到目前为止,我一直在做的是按无权重的平均票数排序。这可不太好,因为一个拥有5.0票(20票)的群体比一个拥有4.9票(平均)和10000票的群体更早。

    这是我的桌子:

    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;
    

    但我只遗漏了一件事(我希望如此):查询中bayesan公式中的4只是一个伪值,因为读到这里我还不明白 what is mean with 'C' 。你能告诉我应该给c添加什么吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   dfundako    8 年前

    在Google'ing Bayes Estimates之后,转到Wikipedia页面,阅读一点,然后转到“Bayes estimators实用示例”部分,它指出

    其中W是加权评级,C是所有评级的平均评级 电影

    因此,这很可能意味着这是一个平均投票/评级,而不考虑群体。