Нелинейная (гиперболическая) кривая в Java - PullRequest
0 голосов
/ 27 марта 2019

У меня есть алгоритм, который выдает данные во время выполнения. Гарантируется, что значение имеет тенденцию к снижению во времени и в идеальных условиях это будет что-то вроде гиперболы (или, по крайней мере, она имеет гиперболическую форму). Базовый график (x ось - время, а y ось - значение) выглядит следующим образом:

value of algorithm over time

Теперь я хотел бы предсказать, как будет выглядеть значение после n временных шагов во время выполнения. Я пытался использовать линейную или полиномиальную регрессию из org.apache.commons.math3, но очевидно, что предсказания не могут быть хорошими, поскольку кривая не является ни линейной, ни полиномиальной. Также оба прогноза дают кривые без тенденции к снижению.

Чтобы решить эту проблему, я попытался использовать наименьших квадратов odinsbane , но у меня проблемы с обеспечением правильного предположения о первых параметрах, и поэтому я не могу правильно подогнать кривую.

Итак, мой вопрос: существует ли какая-либо библиотека kotlin / java, которая могла бы соответствовать моим данным без моего предварительного расчета параметров?

1 Ответ

0 голосов
/ 07 апреля 2019

Мое окончательное решение состояло в том, чтобы использовать этот и его Levenberg–Marquardt решатель.Я разложил общую функцию гиперболы a + b/(x + c) на a * c + a * x + b - y * c = xy - поэтому:

  • setTargetValues получил x*y данные
  • setValues предоставил a * c + a * x + b - y * c значения
  • setDerivatives при условии [c + x, 1, a - y] значения

Это позволило мне сопоставить данные типа "гиперболический".

...