2011-08-11 75 views
2

我試圖在F#中使用Knuth的遞歸公式來製作一個偏斜函數,這個公式是基於Jon Harrop的F#中科學家方差的公式。F#中的偏度遞歸公式#

這裏是我的代碼,(有一個輔助功能)

let skewness_aux (m, m2, m3, k) x = 
    let m' = m + (x - m)/k 
    let m2' = m2 + ((x - m)*(x - m)*(k-1.0))/k 
    m', m2', m3 + (x-m)*(x-m)*(x-m)*(k-1.0)*(k-2.0)/(k*k)-(3.0*(x-m)*m2)/k, k + 1.0;; 

let skewness xs = 
    let _, m2, m3, n2 = Seq.fold skewness_aux (0.0, 0.0, 0.0, 1.0) xs 
    (sqrt(n2) * m3)/(sqrt (m2*m2*m2));; 

最後一個小測試 -

skewness [|2.0; 2.0; 3.0|];; 

應返回1 /(SQRT2)約0.707107,而是給我0.8164965809

比我的任何明智的頭都得到任何意見,爲什麼它不工作?公式看起來是正確的。我正在使用維基百科頁面提供關於更高時刻功能的算法以及Pebay的2008年關於該主題的論文進行交叉檢查。

非常感謝任何和所有幫助。

回答

3

您的skewness_aux函數返回m,m2,m3和k + 1。因此,您需要使用sqrt(n2-1),而不是sqrt(n2)。

+0

很棒的地方。非常感謝!看起來它現在正在工作。 –