2014-01-16 72 views
0

我已经插入在wikipedia在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

是的,没关系:分销本身的价值超过1;应该在[0..1]中的东西是整数,例如。 CDF –

+0

http://en.wikipedia.org/wiki/File:Normal_Distribution_PDF.svg,那是什么意思? –

回答

2

分布函数,一个pdf,具有其值是> = 0的性质和PDF超过-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

对单元测试中捕获的这种性质进行更多的测试,您将能够信心十足地依靠您的代码。

0

难道你不想要的东西,更喜欢这个?

public static double NormalDistribution(double value) 
{ 
    return (1/Math.Sqrt(2 * Math.PI)) * Math.Exp(-Math.Pow(value, 2)/2); 
} 
+0

这是为s = 1,我想要任何s –

0

是的,这是完全OK;分布本身(PDF)可以是任何从0到+无穷大的东西;该事物应该在[0..1]范围内是对应的积分(例如CDF)。

你可以说服自己,看看非随机值的情况:如果该值不是随机的,并且只能有一个常数值,则分布退化(标准误为零,平均值为)狄拉克三角函数:无限高但零宽度的峰值;然而积分(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; 
    }