2014-01-16 70 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; 
    }