f # - Рекурсивная формула для куртоза - PullRequest
3 голосов
/ 12 августа 2011

Я сейчас адаптирую свою формулу для асимметрии , чтобы сделать функцию эксцесса в 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.

Ошибка должна быть в части m4 функции kurtosis_aux или в самой функции kurtosis. Все остальные переменные используются в функции асимметрии и работают правильно.

Опять же, я очень благодарен за любую помощь.

1 Ответ

4 голосов
/ 12 августа 2011

удалить -3.0 в последней строке. с -3.0 вы рассчитываете избыточный эксцесс.

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