C# 似乎无法计算正态分布

C# 似乎无法计算正态分布,c#,normal-distribution,C#,Normal Distribution,我在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; 我反复检查了好几次,我觉得没问题,怎么了?我的执行或理解 例如,如果我们定义

我在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…

您不想要类似的东西吗

public static double NormalDistribution(double value)
{
    return (1 / Math.Sqrt(2 * Math.PI)) * Math.Exp(-Math.Pow(value, 2) / 2);
}
是的,完全可以;分布本身(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;
   }

分布函数(pdf)的属性是其值>=0,并且pdf over-inf到+inf的整数必须为1。但是被积函数,即pdf,可以接受任何大于等于0的值,包括大于1的值

换句话说,没有理由先验地认为pdf值>1表示存在问题

通过考虑减小方差意味着什么,您可以为正态曲线考虑这一点。较小的方差值将概率质量集中在中心。假设总质量始终为1,当质量集中在中心时,峰值必须增加。您可以在链接到的图表中看到这种趋势

您应该做的是将代码的输出与已知的良好实现进行比较。例如,Wolfram Alpha给出的值与您引用的值相同:


再做一点这种性质的测试,在单元测试中捕获,您将能够自信地依赖您的代码。

这是针对s=1的,我希望对于任何sye,都可以:分布本身的值可以超过1;[0..1]中应该包含的东西是积分,例如CDF,那么这意味着什么?