Решение нелинейных уравнений численно

Я предлагаю сделать это немного проще для себя, придумав это немного по-другому. Вместо того, чтобы думать о «временной» таблице, создайте фактическую модель Laravel и создайте все функциональные возможности (вычисления релевантности, пользователя и т. Д.) Внутри.

Имея соединение модель / БД, вы также можете использовать отношения Laravel и вызывать методы этой модели в будущем - IE, если вы хотите добавить новые вычисления релевантности или другие отношения, вы не нужно изменить представление SQL - просто добавьте метод.

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

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

11
задан josliber 7 May 2014 в 16:57
поделиться

4 ответа

Чем ближе Ваше исходное предположение к решению, тем быстрее Вы будете сходиться.

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

Другая идея попробовала бы другой алгоритм оптимизации. Генетический и алгоритмы колонии муравьев может быть хороший выбор, если можно выполнить их на многих центральных процессорах. Они также не требуют непрерывных производных, таким образом, они хороши, если у Вас есть дискретные, прерывистые данные.

2
ответ дан 3 December 2019 в 11:04
поделиться

Я на самом деле не пользовался ни одной из тех библиотек Java, так возьмите это с мелкой частицей соли: на основе бэкендов я, вероятно, посмотрел бы на JLAPACK сначала. Я полагаю, что LAPACK является бэкендом Numpy, который является по существу стандартом для того, чтобы сделать линейную алгебру / математические манипуляции в Python. По крайней мере, определенно необходимо пользоваться хорошо оптимизированной библиотекой C или Fortran, а не чистым Java, потому что для больших наборов данных эти виды задач могут стать чрезвычайно трудоемкими.

Для создания исходного предположения это действительно зависит от того, какой функции Вы пытаетесь соответствовать (и какие данные Вы имеете). В основном просто ищите некоторых относительно быстрых (вероятно, O (N) или лучше) вычисление, которое даст приближенное значение для параметра, который Вы хотите. (Я недавно сделал это с Распределением Гаусса в Numpy, и я оценил среднее как просто average(values, weights = counts) - то есть, взвешенное среднее количеств в гистограмме, которая была истинным средним из набора данных. Это не был точный центр пика, который я искал, но это было рядом достаточно, и алгоритм пошел остальная часть пути.)

Что касается хранения положительных ограничений, Ваш метод кажется разумным. Так как Вы пишете программу, чтобы сделать работу, возможно, просто сделайте булев флаг, который позволяет Вам легко включить или отключить "force-non-negative" поведение и выполнить его оба пути к сравнению. Только если Вы получаете большое несоответствие (или если одна версия алгоритма берет необоснованно долго), это могло бы быть что-то для волнения о. (И НАСТОЯЩИЕ математики сделали бы минимизацию наименьших квадратов аналитически с нуля;-P, таким образом, я думаю, что Вы - тот, который может смеяться над ними.... ребячество. Возможно.)

0
ответ дан 3 December 2019 в 11:04
поделиться

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

Если вам нравится использовать Scipy, я бы порекомендовал scipy.optimize.fmin_l_bfgs_b Вы можете установить простые границы для ваших переменных с помощью L-BFGS-B.

Обратите внимание, что L-BFGS-B принимает общую нелинейную целевую функцию, а не только нелинейная задача наименьших квадратов.

2
ответ дан 3 December 2019 в 11:04
поделиться

Пакет FPL довольно надежен, но имеет несколько причуд (доступ к массиву начинается с 1) из-за его очень буквальной интерпретации старого кода Fortran. Сам метод LM вполне надежен, если ваша функция хорошо работает. Простой способ навязать неотрицательные ограничения - использовать квадрат параметров вместо параметров напрямую. Это может привести к ложным решениям, но для простых моделей эти решения легко отсеять.

Имеется код для "ограниченного" метода LM. Смотрите здесь http://www.physics.wisc.edu/~craigm/idl/fitting.html для mpfit. Есть питон (к сожалению, полагается на Numeric) и версия C. Метод LM занимает около 1500 строк кода, поэтому вы можете захотеть перенести C на Java. Фактически, «стесненный» Метод LM не сильно отличается от метода, который вы себе представляли. В mpfit код регулирует размер шага относительно границ переменных. У меня также были хорошие результаты с mpfit.

У меня не так много опыта работы с BFGS, но код намного сложнее, и я никогда не был ясен в лицензировании кода.

Удачи.

1
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: