На самом деле я не использовал ни одну из этих библиотек Java, поэтому примите это с недолгой солью: основываясь на бэкэндах, я, вероятно, сначала посмотрю на JLAPACK. Я считаю, что LAPACK является бэкэндом Numpy , который по сути является стандартом для выполнения линейной алгебры / математических манипуляций в Python. По крайней мере, вам определенно следует использовать хорошо оптимизированную библиотеку C или Fortran, а не чистую Java, потому что для больших наборов данных такие задачи могут быть чрезвычайно трудоемкими.
Для создания первоначального предположения, это действительно зависит от того, какую функцию вы пытаетесь приспособить (и какие у вас есть данные). По сути, просто ищите относительно быстрые (вероятно, O (N) или лучше) вычисления, которые дадут приблизительное значение для требуемого параметра. (Недавно я сделал это с гауссовым распределением в Numpy, и я оценил среднее значение как average(values, weights = counts)
, то есть средневзвешенное значение подсчетов в гистограмме, которое было истинным средним для набора данных. точный центр пика, который я искал, но он приблизился достаточно близко, и алгоритм пошел до конца.)
Что касается сохранения положительных ограничений, ваш метод кажется разумным. Поскольку вы пишете программу для выполнения этой работы, возможно, просто установите логический флаг, который позволяет легко включать или отключать «принудительное неотрицательное» поведение, и запускать его в обоих направлениях для сравнения. Только если вы получаете большое расхождение (или если одна версия алгоритма занимает слишком много времени), это может повлечь за собой беспокойство. (И НАСТОЯЩИЕ математики будут аналитически минимизировать методом наименьших квадратов с нуля; -П, поэтому я думаю, что вы тот, кто может над ними смеяться .... шучу. Может быть.)