2009-12-06 4 views
13

Wilson interval 또는 이와 동등한 점수를 사용하여 등급에 따라 정렬하려는 비교적 작은 테이블이 있습니다. 나는 합리적으로 스마트 놈,하지만 내 수학 쿵푸이 이해하기에 충분히 강한 근처에 아무데도 :윌슨 점수를 SQL로 구현

Wilson Score http://www.evanmiller.org/images/rating-equation.png

위의 공식은, 내가 이야기하고, (엄지 손가락/긍정적/부정적인에 대한 점수를 계산을 아래로 엄지) 투표 시스템. 저는 통계 과정을 한번도 본 적이 없으며 고급 수학을 한 지 15 년이되었습니다. 나는 작은 모자가 p이 무엇을 의미하는지 또는 어떤 물고기가 z이라는 것을 가리키는 단서가 없다.

나는 두 가지를 알고 싶습니다 :

  1. 이 공식은 5 성급 시스템을 수용하기 위해 변경 될 수 있습니까? 나는 this을 발견했다. 그러나 저자는 그의 공식의 정확성에 관해서 그의 의심을 표현한다.

  2. 이 공식은 SQL 함수에서 어떻게 표현 될 수 있습니까? 실시간으로 계산 및 정렬 할 필요가 없습니다. 점수는 매일 계산되고 캐시 될 수 있습니다.

  3. Microsoft SQL Server에 기본 제공되는 것을 간과하고 있습니까?

+0

페이지 모자에 오라클 PL/SQL 구현을 업로드 = 확률 변수 페이지의 당신의 추정합니다. \ n 대한 중요성을 차단 – twolfe18

+3

+1 예수 물고기 = 알파, 뒤로 물고기가 오리엔테이션을 가지고있는 것처럼 "뒤쪽 예수 물고기". – ash

답변

7

대신 5 별 등급 시스템을 수행하기 위해 윌슨의 알고리즘을 조작하려고합니다. 왜 당신은 다른 알고리즘을 들여다 보지 않겠습니까? 이것은 imdb가 자신의 상위 250 개에 사용하는 것입니다 : Bayesian Estimate

Wilson의 알고리즘에 대한 설명은 아래 첫 번째 게시물의 링크에 게시되었습니다. 루비로 작성되었습니다. http://www.derivante.com/2009/09/01/php-content-rating-confidence/

편집 :

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의 하나입니다 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); 
    } 
} 

SQL에서이 작업을 수행 할 때 SQL에는 이미 라이브러리에있는 모든 수학 함수가 포함되어 있습니다. 내가 너라면 너의 응용 프로그램에서 이걸 할거야. 이 작업을 수행하는 대신 응용 프로그램을 매우 자주 (시간? 일)마다 업데이트해야합니다. 그렇지 않으면 응용 프로그램이 매우 느리게됩니다.

+0

'phat = 1.0 * pos/n' ==='phat = pos/n'이 아닌가? –

+2

아니요,'pos'에'1.0'을 곱하면 그 값을 실수로 나눕니다. 이것은 나누기를 실수로 나눕니다. – cbrauchli

+0

PHP 예제 링크가 더 이상 작동하지 않습니다. –

2

윌리엄스가 PHP 솔루션 http://www.derivante.com/2009/09/01/php-content-rating-confidence/에 연결하여 시스템이 음수 (5 개의 별이 2 개가 될 수 있고 1 개의 시작이 2 개의 음수가 될 수 있음)하면 T로 변환하는 것이 매우 쉽습니다. -SQL,하지만 당신은 서버 측 논리에서 그것을하는 것이 훨씬 낫다.

+3

Paul이 말한 것에 덧붙이 자면, 테이블에 "score"필드를 만든 다음 cron 태스크를 사용하여 X 시간 (또는 일)마다 데이터베이스에서 점수를 업데이트합니다. 이러한 종류의 계산을 수행하는 것은 모든 응용 프로그램의 성능에 매우 나쁜 영향을 미칩니다. – William

+0

동의. 하루에 한 번 값을 계산 한 다음 캐시 된 값을 기준으로 정렬 할 계획입니다. – dansays

4

첫 번째 질문 (공식을 5 등급 시스템으로 조정)에 대해서는 Paul Creasey와 동의합니다.

변환 공식 [3 +/- I 등급 -> I 업/다운 표 (3 등급 -> 0)

예 : 4 등급 -> +1 업 로그인, 5 개 -> +2, 1 -> -2 등입니다.

대신 하부 모두 루비 PHP 함수가 계산되는 구간의 경계의, 난 단지 더 간단한 윌슨 중앙 점 계산 것이지만 I이 양해 것이다 :

(X + (Z^2)/2)/(N + Z^2)

여기서
N = SUM (up_votes) + SUM (| down_votes |)
X = (양 회)/N = SUM (up_votes)/n
z = 1.96 (고정 값)

0

first link의 작성자는 최근에 자신의 게시물에 SQL 구현을 추가했습니다.

는 여기있다 :이 5 성급 호텔 인 시스템에 수용 할 수 있는지 여부

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 widgets WHERE positive + negative > 0 
    ORDER BY ci_lower_bound DESC; 

도 내 능력 밖입니다.

0

나는 https://github.com/mattgrogan/stats_wilson_score

create or replace function stats_wilson_score(

/***************************************************************************************************************** 

Author  : Matthew Grogan 
Website  : https://github.com/mattgrogan 
Name  : stats_wilson_score.sql 
Description : Oracle PL/SQL function to return the Wilson Score Interval for the given proportion. 
Citation : Wilson E.B. J Am Stat Assoc 1927, 22, 209-212 

Example: 
    select 
    round(29/250, 4) point_estimate, 
    stats_wilson_score(29, 250, 0.10, 'LCL') lcl, 
    stats_wilson_score(29, 250, 0.10, 'UCL') ucl 
    from dual; 

******************************************************************************************************************/ 

    x integer, -- Number of successes 
    m integer, -- Number of trials 
    alpha number default 0.95, -- Probability of a Type I error 
    return_value varchar2 default 'LCL' -- LCL = Lower control limit, UCL = upper control limit 
) 

return number is 

    z float(10); 
    phat float(10) := 0.0; 
    lcl float(10) := 0.0; 
    ucl float(10) := 0.0; 

begin 

    if m = 0 then 
    return(0); 
    end if; 

    case alpha 
    when 0.10 then z := 1.644854; 
    when 0.05 then z := 1.959964; 
    when 0.01 then z := 2.575829; 
    else return(null); -- No Z value for this alpha 
    end case; 

    phat := x/m; 

    lcl := (phat + z*z/(2*m) - z * sqrt((phat * (1-phat))/m + z * z/(4 * (m * m))))/(1 + z * z/m); 
    ucl := (phat + z*z/(2*m) + z * sqrt((phat*(1-phat)+z*z/(4*m))/m))/(1+z*z/m); 

    case return_value 
    when 'LCL' then return(lcl); 
    when 'UCL' then return(ucl); 
    else return(null); 
    end case; 

end; 
/
grant execute on stats_wilson_score to public; 
+1

게시하기에 너무 큽니까? 링크가 끊어 질 수 있습니다 ... – vonbrand