LINUX.ORG.RU

Nonlinear fit: GSL vs. Gnuplot vs. Python (scipy). Разбежка в результатах

 , , , ,


0

2

Есть у меня датасет, я пытаюсь его аппроксимировать. Проблема в том, что результаты на выходе у каждой софтины слегка отличаются. Насколько я знаю, метод вычисления везде один и тот же.

Здесь похожая проблема без конкретного решения

Не могу понять, где загвоздка.

P.S. GSL выдает ошибку больше, чем gnuplot. Есть такой пример , не могу понять, почему разрабы первого умножают на GSL_MAX_DBL(1, sqrt(chisq / dof)), а разрабы второго - просто на sqrt(chisq / dof) (я сравнивал результаты). Питон выдаёт значения, которые очень близки к гнуплотовским, разбежка в 3-4 знаках.

Я не сильно знаком с подобными числаками, поэтому могу что-то упускать.

★★★★★

Я бы попробовал в чем то коммерческом (где за такое бьют по голове больно...), для сравнения - чтобы узнать кто врет... Натыкался на проги для КПК и телефонов которые делают неимоверные ошибки в вычислениях.

Питон выдаёт значения

По моему они писали что флоут у них использовать нельзя для серьезной математики...

LinuxDebian ★★★★
()
Ответ на: комментарий от LinuxDebian

В смысле? Если тип float, то у меня double, если в целом non-integer, тогда зачем такой язык нужен.

Вот только что ради интереса протестировал Mathematica. Примерно те же значения, что у python и gnuplot. Надо пойти покурить.

Я понимаю, что дело может быть в round-off error, но я специально взял небольшой датасет на 600 точек.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от LinuxDebian

По моему они писали что флоут у них использовать нельзя для серьезной математики...

В питоне флоат 64-битный, соответствующий IEEE 754, даже без numpy, что еще-то надо?

lu4nik ★★★
()

В общем, есть подозрение, что сам метод странноват. Читал мануал несколько дней, заменил аналитическую производную на разность и получил сходимость на порядок лучше. Значения всё равно слегка расходятся, буду курить маны дальше.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от ZERG

Есть результаты?

Есть. У тебя функция не выпуклая, как результат локальный минимум не является глобальным и методы сходятся возможно к разным локальным минимумам. Причем только один из них является глобальным. Если он вообще есть, ведь функция также не коерцитивная, а значит, если не задана компактная область значения параметров, по которым оптимизируется, то вообще решения может не существовать.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Резонно. Но метод-то одинаков во всех случаях, да и решение существует: питон поддерживает задание диапазонов параметров, при этом выдаётся тот же результат.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от ZERG

питон поддерживает задание диапазонов параметров

this. Таким образом ты задаешь компактное множество допустимых решений. А на таком множестве любая непрерывная функция имеет минимум.

А вот результат будет зависеть в общем случае от стартовой точки и численного метода (а также, возможно и от области допустимых значений параметров). Если хочешь точно попасть в глобальный минимум, то рекомендую решить аналитически (если лень руками, то в CAS сделай). Благо функция у тебя не сложная.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

Забавно, что gnuplot и GSL при одинаковых методах и стартовых точках всё равно расходятся в 3-4 знаке. Но ладно, если ты говоришь, что это нормально, то я в целом могу расслабиться.

P.S. Я вдруг понял, что у меня-то области параметров и не были-то заданы. Только общая зависимость и необходимость равняться единице в точке x == 0. И задать я их не могу, потому что негде взять. Ладно, спасибо в любом случае.

P.P.S. А нет, кое-какие ограничения я могу задать: как минимум tau1 и tau2 больше нуля, а сама функция лежит в диапазоне [-1:1]. Эх, где бы ещё время взять на разбор этого.

ZERG ★★★★★
() автор топика
Последнее исправление: ZERG (всего исправлений: 1)
Ответ на: комментарий от ZERG

Попробуй на наборе в 5-6 точек. Мне здается, что у тебя там куча целая локальных минимумов. Надо методы посерьезней, если хочешь глобальный минимум найти. Так что подумай, может тебе просто локального минимума достаточно?

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Да мне в целом-то не очень важно, это автокорреляция, она и так не суперточная, особенно в конечных точках. В целом должна уменьшаться экспоненциально, но по факту такое далеко не всегда случается.

Просто не было ясно, почему разные софтины выдают отличающиеся ответы. Я боялся, что где-то накосячил, а с проверкой помочь некому было.

Кстати, а что за методы, если уж действительно точно аппроксимировать?

ZERG ★★★★★
() автор топика
Ответ на: комментарий от ZERG

Гарантии ни один метод не даст в общем случае. Но есть всякие достаточно неплохие квази-Ньютоновские методы, или тот же BGFS. Ну и стартовать их из разных точек. А потом выбирать лучшую.

Есть еще Levengerg-Marquardt как раз для аппроксимации.

Но все они локальные. Чтобы получить глобальный минимум надо анализировать функцию и ее производные. Так что общего метода наверное нет.

Но если интересно ищи по словам global minimum.

UPD: https://en.wikipedia.org/wiki/Global_optimization

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.