Pull to refresh

Comments 12

Отличная штука. Планируется продолжение по матфункциям?
Спасибо. Да планирую продолжать по статистике.
Оформляйте в бибилиотеку и на гитхаб. Или каждый тест в свою библиотечку. А то делал прогу на заказ считать несколько критериев, правда было давно, но с бибилиотеками намучался, проще оказалось взять книгу и все считать по формулам (учитывая что такие формулы если с ними хотя бы иногда не работать не только кажутся страшными, но и требуют некоторого времени чтобы их освоить).
Библиотечка в недалёкой перспективе. Надо туда ещё несколько плюшек добавить (и на Хабр запостить). А про использование сторонних библиотек Вы правы, сам помучился, пока не пришёл к идее самостоятельной реализации. За то, материал для статьи есть :)
Я не сильно вглядывался в код (мои вычисления не связаны со статистикой), но возник вопрос: есть ли в подобных формулах места, узкие с точки зрения машинных расчётов? Из разряда: очень малое число на очень малое, etc.
Если да, то как они в целом обходятся?
Было одно узкое место по поводу большое число делить на большое :)
В целом такие места можно обходить за счёт предварительных матпреобразований задачи, с тем, чтобы при расчётах не встречалось ситуаций близких к Infimum/Infimum, 0/0 либо 0 х Infimum.

Мне кажется у вас небольшая опечатка в формуле, в которой вы расписываете функцию распределения Стъюдента через гамма-функцию и гипергеометрическую функцию, там вместо $F{n}(t)$ должно быть $F{n}(x)$. Ну или я что-то недопонял.

Сразу бросаются в глаза штуки вроде Math.log(ser * Math.sqrt(2 * Math.PI)). Math.sqrt(2 * Math.PI) — это константа и её можно вынести из логарифма, заменив умножение сложением:


private static final double SQRT_2_PI = Math.sqrt(2 * Math.PI);

...

Math.log(ser) + SQRT_2_PI

Обычно от математического кода требуется высокая производительность, поэтому уж на такие тривиальные места стоит внимание обращать.


Ну а так, конечно, хотя у статьи есть познавательная ценность, не стоит изобретать велосипеды, когда есть библиотеки (gamma, hypergeometric, t-test).


Наконец, опасайтесь t-test'а. Это самый неправильно используемый статистический критерий в мире. Если вы не доказали нормальность данных, t-test может выдать полный шлак, не относящийся к делу.

Спасибо за комментарий.
1) По поводу вычисления константы — полностью согласен. Код сыроват и это не единственное узкое место.
2) «Профессиональные» библиотеки действительно хорошо выполнены, но иногда слишком наворочены для использования непрофессионалом (например, студентом, только начавшим программировать и уже изучающим статистику). Отсюда и пост.
3) Нормальность данных проверять надо обязательно, это бесспорно. У теста Стьюдента есть ещё ряд применений, я наприер, сего помощью проверяю значимость корреляции Пирспона.
При численной реализации этой формулы для больших значений n возникает проблема с множителем Г((n+1)/2)/ Г(n/2). Не смотря на то, что само отношение имеет достаточно небольшие значения, числитель и знаменатель по отдельности могут принимать значения, для которых не хватит разрядности типа с плавающей точкой. Для разрешения этой проблемы...

А разве не проще здесь использовать разность логарифмов от Гамма-функций?

Спасибо за комментарий! Да, это тоже мог бы быть отдельный подход.

Sign up to leave a comment.

Articles