2011-08-12 32 views
3

我現在正適應我的formula for skewness在F#中做一個峯度函數。不幸的是,它再次返回錯誤的結果。f# - 峯度的遞推公式

這裏是我的代碼

let kurtosis_aux (m, m2, m3, m4, k) x = 
     m + (x - m)/k, 
     m2 + ((x - m)*(x - m)*(k - 1.0))/k, 
     m3 + ((x - m)*(x - m)*(x - m)*(k - 1.0)*(k - 2.0))/(k * k) - (3.0 * (x - m) * m2)/k, 
     m4 + ((x - m)*(x - m)*(x - m)*(x - m)*(k - 1.0)*(k * k - (3.0 * k) + 3.0))/(k * k * k) + 6.0 * (x - m)*(x - m)* m2/(k * k) - (4.0*(x - m)* m3)/k , 
     k + 1.0;; 

let kurtosis xs = 
     let _, m2, m3, m4, n = Seq.fold kurtosis_aux (0.0, 0.0, 0.0, 0.0, 1.0) xs 
     ((n - 1.0) * m4/(m2 * m2)) - 3.0;; 

最後,我測試在一個小載體,並應該得到約2.94631

kurtosis [|9.0; 2.0; 6.0; 3.0; 29.0|];; 

但不是FSI返回-0.05369308728。

該錯誤必須在kurtosis_aux函數的部分m4或峯度函數本身中。其他變量都用在偏斜度函數中並正常工作。

再次,我非常感謝任何和所有的幫助。

+0

應該再次添加,我使用Knuth的增量算法來計算時刻,我想要的公式可以在這裏找到http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance –

回答

4

刪除最後一行中的-3.0。 -3.0你計算過度峯度。

+0

哦。當你考慮這件事的時候很明顯。非常感謝您的幫助:)。 –