Я пытаюсь создать функцию асимметрии в 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 года о предмете перекрестной проверки.
Большое спасибо заранее за любую помощь.