我们有一个相对较小的桌子,我们想根据评级进行排序,使用
Wilson interval或合理的等价物.我是一个相当聪明的人,但是我的数学福祉远不足以理解这一点:
Wilson Score http://www.evanmiller.org/images/rating-equation.png
上面的公式,我被告知,计算一个积极/消极(竖起大拇指)投票系统的得分.我从来没有参加过统计课程,自从我完成了任何高级数学已经15年了.我不知道p是什么意思的小帽子,还是耶稣在z之下的向下表示的东西.
我想知道两件事情:
>这个公式可以改变以适应5星评级系统吗?我发现this,但作者对他的公式的准确性表示怀疑.
>这个公式如何在sql函数中表达?请注意,我不需要实时计算和排序.每天可以计算和缓存得分.
我可以俯瞰Microsoft sql Server内置的内容吗?
解决方法
而不是试图操纵威尔逊的算法来做一个5星级的系统.你为什么不看一个不同的算法?这是imdb用于他们的前250:
Bayesian Estimate
至于解释威尔逊算法的数学,下面是你的第一篇文章中的链接.它是用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
如果你想另一个例子,这里是PHP中的一个:
http://www.derivante.com/2009/09/01/php-content-rating-confidence/
编辑:似乎derivedante.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,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); } }
至于在sql中这样做,sql在其库中已经有了所有这些Math函数.如果我是你,我会在你的应用程序中做到这一点.使您的应用程序每隔一段时间(小时?天?)更新您的数据库,而不是即时更新您的数据库,否则您的应用程序将变得非常慢.