百分位数计算

pic*_*ick 23 c# algorithm math percentile

我想在C#(或在某些伪代码中)模仿Excel等效PERCENTILE函数.我怎样才能做到这一点?该函数应该采用两个参数,其中第一个是值列表,第二个是函数应该计算的百分位数.

坦克!

编辑:我很抱歉,如果我的问题发生了,就像我没有尝试过我自己.我只是无法理解excel函数是如何工作的(是的,我首先尝试了wikipedia和wolfram)并且我认为如果有人在代码中提出它我会更好理解.@CodeInChaos给出了一个似乎就是我追求的答案.

Mar*_*rco 35

我认为维基百科页面有你需要编写自己的函数的公式......
我试过这个:

public double Percentile(double[] sequence, double excelPercentile)
{
    Array.Sort(sequence);
    int N = sequence.Length;
    double n = (N - 1) * excelPercentile + 1;
    // Another method: double n = (N + 1) * excelPercentile;
    if (n == 1d) return sequence[0];
    else if (n == N) return sequence[N - 1];
    else
    {
         int k = (int)n;
         double d = n - k;
         return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]);
    }
}
Run Code Online (Sandbox Code Playgroud)

在CodeInChaos评论之后编辑:
Excel使用介于0和1之间的百分位值(因此我更改了我的代码以使用维基百科公式实现此功能)和另一种用于计算n的方法(因此我更改了评论的).

  • 两个问题:1)Excel似乎使用(N-1)方法2)用0到1之间的数字表示百分位数。 (2认同)

Cod*_*aos 18

试图在以下网址重现结果:http://www.techonthenet.com/excel/formulas/percentile.php我提出:

public static double Percentile(IEnumerable<double> seq,double percentile)
{
    var elements=seq.ToArray();
    Array.Sort(elements);
    double realIndex=percentile*(elements.Length-1);
    int index=(int)realIndex;
    double frac=realIndex-index;
    if(index+1<elements.Length)
        return elements[index]*(1-frac)+elements[index+1]*frac;
    else
        return elements[index];
}
Run Code Online (Sandbox Code Playgroud)

(不处理NaN和无限).

一些测试用例:

Percentile(new double[]{1,2,3,4}, 0.8).Dump();// 3.4
Percentile(new double[]{7,8,9,20}, 0.35).Dump();// 8.05
Percentile(new double[]{1,2,3,4}, 0.3).Dump();// 1.9
Run Code Online (Sandbox Code Playgroud)