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);
在你的情况下numberOfTrials
是3779
和k
是250
。 3779
超过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);