在SQL中实现Wilson分数

dan*_*ays 12 sql algorithm math statistics

我们有一个相对较小的表,我们希望根据评级,使用Wilson间隔或合理的等价物进行排序.我是一个相当聪明的人,但我的数学能力远远不足以理解这一点:

威尔逊得分http://www.evanmiller.org/images/rating-equation.png

据我所知,上述公式计算了正/负(竖起拇指/拇指向下)投票系统的分数.我从未参加过统计学课程,自从我完成了任何高级数学课程已有15年了.我不知道p所穿的小帽子是什么意思,或者是z背后的耶稣鱼所表示的东西.

我想知道两件事:

  1. 这个公式可以改变以适应五星评级系统吗?我发现了这一点,但作者对他的公式的准确性表示怀疑.

  2. 如何在SQL函数中表达此公式?请注意,我不需要实时计算和排序.可以每天计算和缓存分数.

  3. 我是否忽略了内置于Microsoft SQL Server的内容?

Wil*_*iam 7

而不是试图操纵威尔逊的算法来做一个5星评级系统.你为什么不研究一个不同的算法?这就是imdb用于他们的前250名:贝叶斯估计

至于解释威尔逊算法中的数学,下面是在你的第一篇文章的链接上发布的.它是用Ruby编写的.

require 'statistics2'

def ci_lower_bound(pos, n, power)
    if n == 0
        return 0
    end
    z = Statistics2.pnormaldist(1-power/2)
    phat = 1.0*pos/n
    (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
end
Run Code Online (Sandbox Code Playgroud)

如果你想要另一个例子,这里有一个用PHP:http: //www.derivante.com/2009/09/01/php-content-rating-confidence/

编辑:似乎derivante.com已经不在了.您可以在archive.org上看到原始文章 - https://web.archive.org/web/20121018032822/http://derivante.com/2009/09/01/php-content-rating-confidence/和我'我们添加了以下文章中的代码.

class Rating
{
  public static function ratingAverage($positive, $total, $power = '0.05')
  {
    if ($total == 0)
      return 0;
    $z = Rating::pnormaldist(1-$power/2,0,1);
    $p = 1.0 * $positive / $total;
    $s = ($p + $z*$z/(2*$total) - $z * sqrt(($p*(1-$p)+$z*$z/(4*$total))/$total))/(1+$z*$z/$total);
    return $s;
  }
  public static function pnormaldist($qn)
  {
    $b = array(
      1.570796288, 0.03706987906, -0.8364353589e-3,
      -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5,
      -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8,
      0.3657763036e-10, 0.6936233982e-12);
    if ($qn < 0.0 || 1.0 < $qn)
      return 0.0;
    if ($qn == 0.5)
      return 0.0;
    $w1 = $qn;
    if ($qn > 0.5)
      $w1 = 1.0 - $w1;
    $w3 = - log(4.0 * $w1 * (1.0 - $w1));
    $w1 = $b[0];
    for ($i = 1;$i <= 10; $i++)
      $w1 += $b[$i] * pow($w3,$i);
    if ($qn > 0.5)
      return sqrt($w1 * $w3);
    return - sqrt($w1 * $w3);
  }
}
Run Code Online (Sandbox Code Playgroud)

至于在SQL中执行此操作,SQL已将所有这些Math函数放在其库中.如果我是你,我会在你的申请中这样做.让您的应用程序每隔一段时间(几小时?天?)更新您的数据库,而不是动态执行此操作,否则您的应用程序将变得非常慢.

  • 不,将`pos`乘以`1.0`会将其转换为浮点数,这使得该除法成为浮动除法. (2认同)