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

我试图实现以前通过Excel工作表提供的一些function到C#应用程序,但Accord.NET的概率质量函数由于某种原因而不同于Excel函数。

在Excel概率质量函数中,就是这样使用的

=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 

为什么结果如此不同? 有没有办法让雅阁的Excel结果?

编辑: Extreme.Numerics计算与Excel相同的结果,但我不想使用这个库,因为这个库的许可证制度过去总是导致麻烦。

编辑2:似乎像某种溢出错误。

当我使用这个我得到正确的结果:

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

任何想法,为什么这可能会发生?

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

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

在你的情况下numberOfTrials3779k2503779超过250二项式函数超过10 398 ,这对于double数据types来说似乎太多了 (大概的范围高达10 308 )。 所以你在第一个乘法术语中得到了Infinity ,这决定了这里的最终结果。

我不确定Extreme.Numerics是如何实现这个function的,但是你的结果表明他们是以更聪明的方式来实现的。 此外,可悲的是,Accord.NET似乎没有提供其接口的decimal版本。


这个问题似乎已经在最新的Accord.NET实施中得到解决。 现在执行如下 :

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