我已经在{#3}}中使用c#代码插入了公式,我确实得到了一条很好的正常曲线,但获得超过1的值是否合理?它不是一个分配函数吗?
这是C#实现:
double up = Math.Exp(-Math.Pow(x , 2) / ( 2 * s * s ));
double down = ( s * Math.Sqrt(2 * Math.PI) );
return up / down;
我多次检查了几次,这对我来说似乎很好,所以有什么不对吗?我的实施或理解?
例如,如果我们定义x = 0和s = 0.1,则impl将返回3.989 ...
答案 0 :(得分:2)
分布函数pdf具有其值>> 0且pdf over -inf到+ inf的积分必须为1的属性。但是,被整数,即pdf,可以取任何值> = 0,包括大于1的值。
换句话说,没有理由,先验地认为pdf值> 1表示存在问题。
您可以通过考虑减少方差的含义来考虑正常曲线。较小的方差值将概率质量集中在中心。鉴于总质量始终是1,当质量集中在中心时,峰值必须增加。您可以在链接到的图表中看到该趋势。
您应该做的是将代码的输出与已知良好的实现进行比较。例如,Wolfram Alpha提供与您引用的值相同的值:http://www.wolframalpha.com/input/?i=normal+distribution+pdf+mean%3D0+standard+deviation%3D0.1+x%3D0&x=6&y=7
在单元测试中捕获这种性质的更多测试,您将能够充满信心地依赖您的代码。
答案 1 :(得分:0)
你不想要更像这样的东西吗?
public static double NormalDistribution(double value)
{
return (1 / Math.Sqrt(2 * Math.PI)) * Math.Exp(-Math.Pow(value, 2) / 2);
}
答案 2 :(得分:0)
是的,完全没问题;分布本身(PDF)可以是从0到+无穷大的任何东西;该事物应该在[0..1]范围内,是相应的积分(例如 CDF )。
如果看一下非随机值的情况,你可以说服自己:如果该值根本不是随机的,并且只能有一个常数值,则分布退化(标准误差为零,均值为值)进入Dirac Delta函数:无限高峰但零宽度的峰值;然而,从-infinity到+ infinity的积分(CDF)是1。
// If you have special functions implemented (i.e. Erf)
// outcoume is in [0..inf) range
public static Double NormalPDF(Double value, Double mean, Double sigma) {
Double v = (value - mean) / sigma;
return Math.Exp(-v * v / 2.0) / (sigma * Math.Sqrt(Math.PI * 2));
}
// outcome is in [0..1] range
public static Double NormalCDF(Double value, Double mean, Double sigma, Boolean isTwoTail) {
if (isTwoTail)
value = 1.0 - (1.0 - value) / 2.0;
//TODO: You should have Erf implemented
return 0.5 + Erf((value - mean) / (Math.Sqrt(2) * sigma)) / 2.0;
}