Рекурсивная формула для асимметрии в F # - PullRequest
2 голосов
/ 11 августа 2011

Я пытаюсь создать функцию асимметрии в 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

Какие-нибудь более мудрые головы, чем моя, получили какой-либо совет, почему он не работает? Формулы выглядят правильно. Я использую страницу Википедии об алгоритмах для функций с более высоким моментом, а также статью Пебая 2008 года о предмете перекрестной проверки.

Большое спасибо заранее за любую помощь.

1 Ответ

3 голосов
/ 11 августа 2011

Ваша функция skewness_aux возвращает m, m2, m3 и k + 1.Поэтому вам нужно использовать sqrt (n2-1), а не sqrt (n2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...