Accord.Net二项概率质量函数结果与Excel结果不同

时间:2014-04-22 14:13:52

标签: c# .net excel accord.net

我正在尝试将以前通过Excel工作表提供的一些功能实现到C#应用程序中,但probability mass function of Accord.NET由于某种原因与excel功能不同。

在excel中使用概率质量函数this way

=BINOM.DIST(250; 3779; 0.0638; FALSE)

Result: 0.021944019794458

当我尝试使用Accord.NET时

var binom = new BinomialDistribution(3779, 0.0638);
binom.ProbabilityMassFunction(250);

// Result: Infinity

但累积分布似乎正常工作(除了最后几位数,但我认为这只是某种精度误差)

Excel中:

=BINOM.DIST(250; 3779; 0.0638; TRUE)

Result: 0.736156366002849

Accord.NET:

var binom = new BinomialDistribution(3779, 0.0638);
binom.DistributionFunction(250);

// Result: 0.736156366002318

为什么结果如此不同?有没有办法通过Accord获得Excel结果?

编辑: Extreme.Numerics计算与Excel相同的结果,但我不想使用此库,因为此库的许可证系统过去总是导致问题。

编辑2:好像是某种溢出错误。

当我使用它时,我得到了正确的结果:

Math.Exp(binom.LogProbabilityMassFunction(250));

为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:5)

检查Accord.NET实现的源代码,可以看出ProbabilityMassFunction的工作原理如下:

//...
return Special.Binomial(numberOfTrials, k) * Math.Pow(probability, k)
            * Math.Pow(1 - probability, numberOfTrials - k);

在您的情况下,numberOfTrials3779k2503779超过250的二项式函数为more than 10398seems too much for the double data type(近似范围达到10以上 308 )。所以你在第一个乘法项中得到Infinity,这决定了最终的结果。

我不确定Extreme.Numerics如何实现这一点,但您的结果表明他们以更聪明的方式执行此操作。另外,遗憾的是,Accord.NET似乎没有提供decimal版本的界面。


这个问题似乎已在最新的Accord.NET实现中得到修复。实施looks now as follows

double log = Special.LogBinomial(numberOfTrials, k) + k * Math.Log(probability)
    + (numberOfTrials - k) * Math.Log(1 - probability);

return Math.Exp(log);