Nos*_*dna 10 r octave curve-fitting nonlinear-optimization
我正在寻找一个非线性曲线拟合程序(可能最有可能在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"
Run Code Online (Sandbox Code Playgroud)
我得到的是至少常数(A,B,C等)的值,并希望有关比赛适合度的统计数据.
有商业程序可以做到这一点,但我希望能找到适合现在语言库中所需表达式的常用内容.我怀疑SciPy的优化能力可能会做到这一点,但我看不出它让我定义了一个等式.同样,我似乎无法在R中找到我想要的东西.
我正在寻找那里,还是我需要自己动手?我讨厌这样做,如果它在那里,我只是找不到它.
编辑:我想这样做是为了更多地控制过程,而不是从LAB Fit获得.LAB Fit UI非常糟糕.我也希望能够将范围分成多个部分,并且不同的曲线代表范围的不同部分.最后,结果必须能够(速度)用线性插值击败LUT,或者我不感兴趣.
在我当前的一组问题中,我有trig函数或exp(),我需要实时执行它们每秒352,800次(并且只使用一小部分CPU).因此,我绘制曲线并使用数据来驱动曲线拟合器以获得更便宜的近似值.在过去,LUT几乎总是解决方案,但现在跳过内存查找并进行近似有时会更快.
您的第一个模型在三个参数中实际上是线性的,并且可以适合R使用
fit <- lm(y ~ x + I(x^2), data=X)
Run Code Online (Sandbox Code Playgroud)
这将为您提供三个参数.
第二个模型也适合nls()在R中使用,通常需要提供起始值等.优化中的统计问题不一定与数值问题相同- 您不能只是优化任何函数形式,无论您使用哪种语言选择.
为了回答一般意义上的问题(关于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) )
Run Code Online (Sandbox Code Playgroud)
获得系数,类似于
getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)
Run Code Online (Sandbox Code Playgroud)
如果你想要'nls'的标准错误,
summary(out)$parameters
Run Code Online (Sandbox Code Playgroud)
帮助文件和r-help邮件列表帖子包含许多关于每个实现的特定最小化算法的讨论(上面每个示例案例中使用的默认值)以及它们对于手头等式的特定形式的适当性.某些算法可以处理框约束,另一个名为constrOptim()的函数将处理一组线性约束.本网站也可能有所帮助:
http://cran.r-project.org/web/views/Optimization.html