Поиск кривой для сопоставления данных

Я ищу подпрограмму подбора нелинейной кривой (вероятно, скорее всего, ее можно найти в R или Python, но я открыт для других языков), которая будет принимать данные x, y и соответствовать кривой.

Я могу указать в качестве строки тип выражения, которое я хочу поместить.

Примеры:

"A+B*x+C*x*x"
"(A+B*x+C*x*x)/(D*x+E*x*x)"
"sin(A+B*x)*exp(C+D*x)+E+F*x"

Что бы я выбрал из этого, это, по крайней мере, значения констант (A, B, C и т.д.). И, надеюсь, статистика о пригодности матча.

Есть коммерческие программы, чтобы сделать это, но я ожидал, что смогу найти что-то общее, подходящее для желаемого выражения в языковой библиотеке в настоящее время. Я подозреваю, что материал оптимизации SciPy мог бы это сделать, но я не вижу, что он позволяет мне определить уравнение. Точно так же я не могу найти то, что я хочу в R.

Это то, что я ищу там, или мне нужно катиться самостоятельно? Я ненавижу делать это, если он есть, и мне просто трудно найти его.


Изменить: я хочу сделать это для немного большего контроля над процессом, чем от LAB Fit. Пользовательский интерфейс LAB Fit ужасен. Я также хотел бы разбить диапазон на несколько частей и иметь разные кривые, представляющие разные части диапазона. В конце концов, результат должен быть способен (по скорости) бить LUT с линейной интерполяцией или мне неинтересно.

В моем текущем наборе проблем у меня есть триггерные функции или exp(), и мне нужно выполнить их 352 800 раз в секунду в реальном времени (и использовать только часть процессора). Поэтому я рисую кривую и использую данные для приведения кривой слесаря, чтобы получить менее дорогие аппроксимации. В прежние времена LUTs были почти всегда решением, но в настоящее время пропускают поиск в памяти и иногда приближаются.

Ответ 1

Чтобы ответить на ваш вопрос в общем смысле (относительно оценки параметров в R), не учитывая специфику уравнений, которые вы указали, я думаю, что вы ищете nls() или optim()... 'nls' - это мой первый выбор, поскольку он дает оценки ошибок для каждого оценочного параметра, а когда он терпит неудачу, я использую "optim". Если у вас есть переменные x, y:

out <- tryCatch(nls( y ~ A+B*x+C*x*x, data = data.frame(x,y), 
                start = c(A=0,B=1,C=1) ) ,
                error=function(e) 
                optim( c(A=0,B=1,C=1), function(p,x,y)  
                      sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y) )

чтобы получить коэффициенты, что-то вроде

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)

Если вам нужны стандартные ошибки в случае "nls",

summary(out)$parameters

В файлах справки и почтовых рассылках r-help содержится много обсуждений по конкретным алгоритмам минимизации, реализованным каждым (по умолчанию используется в каждом примере выше) и их уместности для конкретной формы уравнения. Некоторые алгоритмы могут обращаться с ограничениями на окна, а другая функция constrOptim() будет обрабатывать набор линейных ограничений. Этот веб-сайт также может помочь:

http://cran.r-project.org/web/views/Optimization.html

Ответ 2

Ваша первая модель фактически линейна по трем параметрам и может быть помещена в R, используя

 fit <- lm(y ~ x + I(x^2), data=X)

который предоставит вам три параметра.

Вторая модель также может быть использована с использованием nls() в R с обычными предостережениями, необходимыми для предоставления стартовых значений и т.д. Статистические проблемы в оптимизации не обязательно совпадают с численными проблемами - вы не можете просто оптимизировать любые функциональные формы, независимо от того, какой язык вы выберете.

Ответ 3

Отъезд GNU Octave - между его решением polyfit() и нелинейными ограничениями должно быть возможно построить что-то подходящее для вашей проблемы.

Ответ 4

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

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

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

Ответ 5

В R это довольно просто.

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

Затем вы вызываете его как out = optim (1, err_fn)

где err_fn

err_fn = function(A) {
    diff = 0;
    for(i in 1:data_length){
      x = eckses[i];
      y = data[i];
      model_y = A*x;
      diff = diff + ( y - model_y )^2
    }
    return(diff);
}

Это только предполагает, что у вас есть вектор значений x и y в eckses и data. Измените строку model_y, как вы сочтете нужным, даже добавьте больше параметров.

Он работает на нелинейном просто отлично, я использую его для четырехмерных кривых e ^ x, и это очень быстро. Выходные данные включают в себя значение ошибки в конце фитинга, которое является мерой того, насколько хорошо он подходит, заданный как сумма квадратов различий (в моем err_fn).

EDIT: Если вам НЕОБХОДИМО взять модель в виде строки, вы можете настроить свой пользовательский интерфейс для всего процесса установки модели как R script и загрузить его для запуска. R может принимать текст из STDIN или из файла, поэтому не должно быть слишком сложно создавать эквивалент этой функциональной строки и автоматически запускать ее автоматически.

Ответ 6

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

они не мой первый выбор, но если вы пытаетесь найти коэффициенты второй функции, которую вы упомянули, тогда, возможно, GAs будут работать, особенно если вы используете нестандартные показатели для оценки наилучшего соответствия. например, если вы хотите найти коэффициенты "(A + Bx + Cx ^ 2)/(Dx + Ex ^ 2)", так что сумма квадратных разностей между вашей функцией и данными минимальна и что существует некоторое ограничение на arclength результирующей функции, тогда стохастический алгоритм может быть хорошим способом приблизиться к этому.

некоторые оговорки: 1) стохастические алгоритмы не гарантируют наилучшего решения, но часто будут очень близки. 2) вы должны быть осторожны в отношении устойчивости алгоритма.

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