我正在尝试将以前通过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));
为什么会发生这种情况的任何想法?
答案 0 :(得分:5)
检查Accord.NET实现的源代码,可以看出ProbabilityMassFunction
的工作原理如下:
//...
return Special.Binomial(numberOfTrials, k) * Math.Pow(probability, k)
* Math.Pow(1 - probability, numberOfTrials - k);
在您的情况下,numberOfTrials
为3779
,k
为250
。 3779
超过250
的二项式函数为more than 10398,seems 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);