2011-08-12 11 views
3

F#で尖度関数を作成するために私のformula for skewnessを適合させています。残念ながら、それは再び間違った結果を返します。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のIncrementalアルゴリズムを使用してモーメントを計算しています。私が目指している式がここにあります。http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance –

答えて

4

最後の行で-3.0を削除します。 を-3.0とすると、余分な尖度が計算されます。

+0

ああ。あなたがそれについて考えるとき、明らかな種類です。助けてくれてありがとう。 –