我正在寻找一个非线性曲线拟合程序(可能是最有可能在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上。

就是我正在寻找在那里,或是否需要推出自己的?我讨厌这样做,如果它的存在,我只是无法找到它。


编辑:我要超过比我从实验室飞度获得的过程更多的控制做到这一点。劳顾飞度UI是可怕的。我还希望能够打破的范围内为多个部分,并有不同的曲线代表不同部分的范围内的。最后,结果必须能够(速度明智)击败与线性内插的LUT或我不感兴趣。

在我的当前组的问题,我有三角函数或EXP()和我需要执行它们每秒352800次实时(和仅使用CPU的一小部分)。所以我绘制曲线,并利用这些数据来驱动曲线拟合得到更便宜的近似值。在过去,LUT中几乎总是该溶液中,但现在跳过存储器查找和做的近似是有时更快。

有帮助吗?

解决方案

要在不考虑你所指出的公式的具体回答(关于R参数估计),在一般意义上你的问题,我想的Optim()你正在寻找NLS()或者......“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-帮助邮件列表的帖子中包含关于由每个(在上面各实施例中情况下使用的默认值)和其手头的方程的具体形式实施的适当性特定最小化算法进行的讨论。某些算法可以处理盒约束和)被称为constrOptim(另一个函数将处理一组线性约束。该网站还可以帮助:

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

其他提示

您第一模型实际上是线性在三个参数,并且可以使用中的R是配合

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

这将让您的三个参数。

第二个模型,也可以使用适合nls()中的R与具有提供的初始值的通常的注意事项等。统计在优化问题不一定相同的数值的问题 - 你不能只是优化任何函数形式,无论你选择哪种语言

查核 GNU倍频 - 之间的其polyfit()和非线性约束求解器它应该是可能构造适合你的问题的东西。

在R,这是很容易的。

内置的方法被称为的Optim()。这需要作为参数势参数,则函数的起始载体。你必须去建立自己的错误的功能,但是这是非常简单的。

然后调用它喜欢出的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和数据的载体。更改model_y行,你认为合适,甚至可以添加更多的参数。

它适用于非线性就好了,我用它的四维E 1 X曲线,这是非常快的。输出数据包括在所述接头的端部作为差的平方和给定的(在我err_fn)的误差值,这是它适合如何的量度。

编辑: 如果你需要在模型中作为一个字符串,你可以有你的用户界面构建这整个模型拟合过程的R脚本,并在加载运行。 R可以采取文字从STDIN或从一个文件中,所以它应该不会太难手艺此功能的等效字符串,并让它自动运行的Optim。

你可能不会找到与你的例子(多项式和使用相同的常规有理函数)隐含的灵活性单一套路,更不用说一个将解析字符串弄清楚什么样的方程的拟合。

一个最小二乘多项式钳工将适合于您的第一个例子。 (这取决于你使用什么多项式 - 二次型,三次,四次,等等)。对于像你的第二个例子理性的功能,你可能要“滚你自己”,如果你不能找到一个合适的库。另外,请记住,一个足够高的多项式可以用来逼近你的“真实”的功能,只要你不需要来推断超出了数据的限制设置你拟合。

正如其他人指出,还有其它更广义参数估计算法可能也证明是有用的。但是,这些算法都不太“即插即用”:他们通常要求你写一些帮助程序,并提供初始值的列表模型参数。这是可能的,这些各种各样的算法发散,或陷入局部最小或最大的初始参数估计的一个不幸的选择。

如果您有限制你的系数,你知道有你想要以适合您的数据的功能的具体类型和功能是一个混乱的一个地方标准的回归方法或其他曲线拟合方法不会工作中,你有没有考虑遗传算法?

他们不是我的第一选择,但如果你正在努力寻找你提到的第二个函数的系数,那么也许气体将工作---特别是如果你使用的是非标准的指标来评估最合适的。例如,如果你想找到的“(A + Bx的+ CX ^ 2)/(DX +实施例^ 2)”,使得你的函数和数据之间平方差之和最小的有上所得到的函数的弧长某些约束,则随机算法可能是解决这个的好方法。

一些注意事项:1)随机算法将不能保证最好的解决方案,但他们往往会非常接近。 2)必须要小心的算法的稳定性。

这是一个较长的注意,如果你在哪里,你想找到某些功能的空间,最适合您的数据的函数级(例如,你是不是要征收,也就是说,你的数据在第二个模型) ,然后遗传编程技术也可有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top