找到一个曲线拟合数据(Finding a curve to match data)

2019-07-04 04:10发布

我正在寻找一个非线性曲线拟合程序(可能是最有可能在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的分数)。 所以我绘制曲线,并利用这些数据来驱动曲线拟合得到更便宜的近似值。 在过去,查找表几乎总是解决方案,但现在跳过内存查找和做一个近似,有时快。

Answer 1:

为了不考虑你所指出的公式的具体回答(关于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



Answer 2:

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

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

这将让您的三个参数。

第二模型还可以使用适合nls()中的R与具有以提供初始值等在优化的统计问题不一定相同的数值问题的通常警告-你不能仅仅优化任何功能形式不管哪种语言选择。



Answer 3:

看看GNU八度 -其polyfit()和非线性约束求解它应该是可以构建适合您的问题的东西之间。



Answer 4:

在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。



Answer 5:

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

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

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



Answer 6:

如果你有制约的系数,你知道有你想要以适合您的数据的功能的具体类型和功能是一个混乱的一个地方标准的回归方法或其他曲线拟合方法是行不通的,有你认为是遗传算法?

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

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

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



文章来源: Finding a curve to match data