2011-08-11 16 views
2

私は科学者のためのJon HarropのF#の分散の式に基づいて、Knuthの再帰式を使用して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|];; 

0.707107約1 /(SQRT2)を返す必要がありますが、代わりに与えています私は0.8164965809

私の頭よりも賢明な頭部は、それが動作していない理由についてのアドバイスを得た?数式は正しいように見えます。私はより高いモーメント機能のためのアルゴリズムに関するウィキペディアページと、クロスチェックの対象となるPebayの2008年の論文を使用しています。

事前にご協力いただきありがとうございます。

答えて

3

skewness_aux関数は、m、m2、m3、およびk + 1を返します。したがって、sqrt(n2-1)ではなくsqrt(n2-1)を使用する必要があります。

+0

グレートスポット。どうもありがとうございます!今働いているように見えます。 –