Лучший способ найти кривую квадратичной регрессии в Java - PullRequest
2 голосов
/ 16 января 2010

У меня есть три набора данных, таких как:

x   y
4   0
6   60
8   0

Кто-нибудь знает (эффективные) Java-коды, которые могут вернуть мне значения a, b и c (коэффициенты)?

Ответы [ 3 ]

6 голосов
/ 16 января 2010

Я предполагаю, что вы хотите формулу в этой форме:

y = a * x^2 + b*x + c

Если у вас есть только три точки, вы можете описать квадратичную кривую, которая проходит через все три точки, с помощью формулы:

y = ((x-x2) * (x-x3)) / ((x1-x2) * (x1-x3)) * y1 +
    ((x-x1) * (x-x3)) / ((x2-x1) * (x2-x3)) * y2 +
    ((x-x1) * (x-x2)) / ((x3-x1) * (x3-x2)) * y3

В вашем примере:

x1 = 4, y1 = 0, x2 = 6, y2 = 60, x3 = 8, y3 = 0

Чтобы получить коэффициенты a, b, c в терминах x1, x2, x3, y1, y2 и y3, вам просто нужно умножить формулу и затем собрать члены. Это не сложно, и он будет работать очень быстро, но наберет много кода. Вероятно, было бы лучше найти пакет, который уже делает это для вас, но если вы хотите сделать это самостоятельно, это как ты мог это сделать.

Тот факт, что два члена y равны нулю в вашем примере, значительно упрощает формулу, и вы можете воспользоваться этим. Но если это было просто совпадение, а не общее правило, тогда вам нужна полная формула.

2 голосов
/ 16 января 2010

Интерполяция Лагранжа, вероятно, является наиболее «эффективным» (как вы это измеряете?) Решением, которое вы найдете.Поэтому я предложу совершенно общий код.Вы хотели код, верно? Этот код может быть линейным, квадратичным, кубическим, .... для любого количества точек.

На самом деле я не пытался его скомпилировать, поэтому не буду, если источникКод актуален.Вы знаете, как идут онлайн-демонстрации.Тем не менее, апплет со связанной веб-страницы полностью функционален.Файл jar будет работать автономно.С изменяемым размером окна вам действительно не нужно настраивать его.

1 голос
/ 16 января 2010

Это зависит от того, что именно вы ищете: вы ищете уникальный многочлен, который определяется этими тремя точками, или вы ищете библиотеку, которая будет генерировать многочлен, который проходит через все точки?

Если вы смотрите на первое, лучший метод - это построить матрицу коэффициентов (то есть набор из трех линейных уравнений, которые однозначно ограничивают это квадратное уравнение) и применить метод исключения Гаусса, чтобы получить ваш результат. Это может быть сделано вручную наиболее эффективно, но вы также можете использовать Методы Real Matrix Библиотеки Apache Commons solve. ( РЕДАКТИРОВАТЬ Спасибо за исправление - я говорю раньше, чем иногда думаю;)

Если вы посмотрите на вторую, это частный случай общего класса задач, называемого Интерполяция полиномами , и есть несколько способов решения - сплайны - мой личный фаворит, но у всех есть их сильные и слабые стороны. К счастью, Apache Commons Math реализует несколько таких методов. Я бы посмотрел на SplineInterpolator класс. Сплайны используют кубики вместо квадратиков, но они, как правило, очень хорошие приближения. Они также не терпят неудачу, если одна точка линейно кратна другой.

Только для трех пунктов оба метода должны быть примерно одинаковыми по характеристикам производительности. Однако, если вы делаете более трех пунктов, я настоятельно рекомендую использовать интерполяцию, поскольку использование Guassian Elification невероятно плохо масштабируется (O (n ^ 3)), а сплайны (или другой метод интерполяции) менее вероятны сбои.

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