2010-11-23 2 views
4

누구든지 C#으로 변환 할 수 있습니까? 말 그대로 내 두뇌를 아프게합니다.Ruby Wilson 스코어 C#에서

http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

Wilsons Score

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 

이 무엇을 의미합니까?

Statistics2.pnormaldist(1-power/2) 
+1

그건 내 머리를 아프게합니다. 시도 해 봤나? http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/fb3a8714-e458-4b7d-b669-1bd610258081/? 또한 C#의 정규 분포는 다음과 같습니다. http://msdn.microsoft.com/en-us/library/system.windows.forms.datavisualization.charting.statisticformula.normaldistribution(VS.100).aspx – Josh

답변

5

...

이 유래의 artice를 알려준 : Objective-C implementation of the Wilson Score Interval

이 목표 -c를 C#으로 수동으로 변환했으며 완전히 테스트되지 않았습니다.

public class WilsonScore 
{ 
    private static double pnormaldist(double qn) 
    { 
     double[] b = { 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; 

     double w1 = qn; 
     if (qn > 0.5) 
      w1 = 1.0 - w1; 
     double w3 = -Math.Log(4.0 * w1 * (1.0 - w1)); 
     w1 = b[0]; 
     int i = 1; 
     for (; i < 11; i++) 
      w1 += b[i] * Math.Pow(w3, i); 

     if (qn > 0.5) 
      return Math.Sqrt(w1 * w3); 
     return -Math.Sqrt(w1 * w3); 
    } 

    public static double ci_lower_bound(int pos, int n, double power) 
    { 
     if (n == 0) 
      return 0.0; 
     double z = pnormaldist(1 - power/2); 
     double phat = 1.0 * pos/n; 
     return (phat + z * z/(2 * n) - z * Math.Sqrt((phat * (1 - phat) + z * z/(4 * n))/n))/(1 + z * z/n); 
    } 
} 
관련 문제