似乎无法计算正态分布

时间:2014-01-16 06:31:44

标签: c# normal-distribution

我已经在{#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 ...

3 个答案:

答案 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;
   }