R语言使用nls拟合,为什么总说循环次数大于50

Python011

R语言使用nls拟合,为什么总说循环次数大于50,第1张

nls的数据源必须有误差。不能精确等于公式返回值(零残差)。循环次数大于50通常是使用 函数精确返回值 作为数据源去拟合函数。必须给y值加上随机误差。

z=function(x,a,b){a*sin(x)+b*cos(x)}

x=seq(1,10,9/500)

y=z(x,1,1) # a=1 b=1 是期望拟合出的结果。

cor=data.frame(x=x,y=y)

cor$res=runif(length(cor$x),min=-0.005,max=0.005)

cor$yres=cor$y+cor$res

#yres =y加上随机误差,y是精确返回值

> nls(cor$yres~z(cor$x,a,b),data=cor,start=list(a=0.8,b=1.3))

Nonlinear regression model

  model: cor$yres ~ z(cor$x, a, b)

   data: cor

     a      b 

0.9999 1.0002 

 residual sum-of-squares: 0.004213

Number of iterations to convergence: 1 

Achieved convergence tolerance: 2.554e-07

#使用精确返回值拟合就会出错。

> nls(cor$y~z(cor$x,a,b),data=cor,start=list(a=1,b=1))

Error in nls(cor$y ~ z(cor$x, a, b), data = cor, start = list(a = 1, b = 1)) : 

  循环次数超过了50这个最大值

没有具体的建模数值,因为根据不同形态的建模,需要设置的数值都是不同的,最基础的是可选择的缩放参数。

例如:

w = torch.Tensor(3, 5)

nn.init.xavier_uniform(w, gain=nn.init.calculate_gain('relu'))

非线性回归的初始值设置方法:

1.查阅他人已有文献,采用其参数作为初始值;

2.将可线性化的方程进行变换(如对数变换),将其线性化后采用线性回归的计算参数,得到的参数进行相应的变换后代入原方程作为初始值;

3.更改算法,R语言可以尝试minpack包的nls.LM()函数,quantreg包的 dynrq()函数进行分位数回归

4.瞎蒙

R语言一直警告达到最大叠代次数停止方法如下

在R语言中使用多元非线性回归(nls函数)时,经常会遇到“Error in nls 循环次数超过了50这个最大值”问题。

主要原因在于nls中默认的最大迭代次数为50,此时,只需使用nls.control修改最大迭代次数即可。

比如将最大迭代次数修改为1000