NLS 函数 - 迭代次数超过最大值
Posted
技术标签:
【中文标题】NLS 函数 - 迭代次数超过最大值【英文标题】:NLS Function - Number of Iterations Exceeds max 【发布时间】:2019-03-13 12:20:35 【问题描述】:我有一个如下所示的数据集:
dput(testing1)
structure(list(x = c(0, 426.263081392053, 852.526162784105,
1278.78924417616,
1705.05232556821, 2131.31540696026, 2557.57848835232, 2983.84156974437,
3410.10465113642, 3836.36773252847, 4262.63081392053, 4688.89389531258,
5115.15697670463, 5541.42005809668, 5967.68313948874, 6393.94622088079,
6820.20930227284, 7246.4723836649, 7672.73546505695, 8098.998546449,
8525.26162784105, 8951.52470923311, 9377.78779062516, 9804.05087201721,
10230.3139534093, 10656.5770348013, 11082.8401161934, 11509.1031975854,
11935.3662789775, 12361.6293603695, 12787.8924417616, 13214.1555231536,
13640.4186045457, 14066.6816859377, 14492.9447673298, 14919.2078487218,
15345.4709301139, 15771.734011506, 16197.997092898, 16624.2601742901,
17050.5232556821, 17476.7863370742, 17903.0494184662, 18329.3124998583,
18755.5755812503, 19181.8386626424, 19608.1017440344, 20034.3648254265,
20460.6279068185, 20886.8909882106, 21313.1540696026, 21739.4171509947,
22165.6802323867, 22591.9433137788, 23018.2063951708, 23444.4694765629,
23870.732557955, 24296.995639347, 24723.2587207391, 25149.5218021311,
25575.7848835232, 26002.0479649152, 26428.3110463073, 26854.5741276993,
27280.8372090914, 27707.1002904834, 28133.3633718755, 28559.6264532675,
28985.8895346596, 29412.1526160516, 29838.4156974437, 30264.6787788357,
30690.9418602278, 31117.2049416198, 31543.4680230119, 31969.7311044039,
32395.994185796, 32822.2572671881, 33248.5203485801, 33674.7834299722,
34101.0465113642, 38363.6773252847, 42626.3081392053, 46888.9389531258,
51151.5697670463, 55414.2005809668, 59676.8313948874, 63939.4622088079,
68202.0930227284, 72464.7238366489, 76727.3546505695, 80989.98546449,
85252.6162784105, 89515.247092331, 93777.8779062516, 98040.5087201721,
102303.139534093, 106565.770348013, 110828.401161934, 115091.031975854,
119353.662789775, 123616.293603695, 127878.924417616, 132141.555231536,
136404.186045457, 140666.816859377, 144929.447673298, 149192.078487218,
153454.709301139, 157717.340115059, 161979.97092898, 166242.601742901,
170505.232556821, 174767.863370742, 179030.494184662, 183293.124998583,
187555.755812503, 191818.386626424, 196081.017440344, 200343.648254265,
204606.279068185, 208868.909882106, 213131.540696026, 217394.171509947,
221656.802323867, 225919.433137788, 230182.063951708, 234444.694765629,
238707.32557955, 242969.95639347, 247232.587207391, 251495.218021311,
255757.848835232, 260020.479649152, 264283.110463073, 268545.741276993,
272808.372090914, 277071.002904834, 281333.633718755, 285596.264532675,
289858.895346596, 294121.526160516, 298384.156974437, 302646.787788357,
306909.418602278, 311172.049416198, 315434.680230119, 319697.311044039,
323959.94185796, 328222.572671881, 332485.203485801, 336747.834299722,
341010.465113642, 345273.095927563, 349535.726741483, 353798.357555404,
358060.988369324, 362323.619183245, 366586.249997165, 370848.880811086,
375111.511625006, 379374.142438927, 383636.773252847, 387899.404066768,
392162.034880688, 396424.665694609, 400687.296508529, 404949.92732245,
409212.55813637, 413475.188950291, 417737.819764212, 422000.450578132,
426263.081392053), y = c(0, 9.28064156596666, 18.545900177512,
27.795801332368, 37.0303704859999, 46.2496330516791, 55.4536144005578,
64.6423398617293, 73.8158347223069, 82.9741242274896, 92.1172335806295,
101.245187943305, 110.35801243539, 119.455732135116, 128.538372079151,
137.605957262664, 146.658512639393, 155.696063121713, 164.718633580707,
173.726248846234, 182.718933706996, 191.696712910606, 200.659611163661,
209.607653131799, 218.540863439782, 227.459266671548, 236.362887370294,
245.25175003853, 254.125879138154, 262.98529909052, 271.830034276498,
280.660109036552, 289.475547670796, 298.276374439066, 307.06261356099,
315.834289216049, 324.591425543646, 333.334046643171, 342.062176574072,
350.775839355914, 359.47505896845, 368.159859351686, 376.830264405948,
385.486297991944, 394.127983930833, 402.755346004291, 411.368407954574,
419.967193484584, 428.551726257936, 437.12202989902, 445.67812799307,
454.220044086226, 462.747801685598, 471.261424259333, 479.760935236681,
488.246358008055, 496.717715925098, 505.175032300746, 513.618330409295,
522.047633486465, 530.462964729454, 538.86434729702, 547.251804309526,
555.625358849021, 563.985033959285, 572.33085264591, 580.662837876353,
588.981012579999, 597.285399648232, 605.576021934488, 613.852902254326,
622.116063385486, 630.365528067953, 638.601319004021, 646.823458858352,
655.031970258043, 663.226875792685, 671.408198014427, 679.575959438034,
687.730182540955, 695.870889763381, 776.539498886984, 855.880929901957,
933.917017841173, 1010.66923850263, 1086.15871435967, 1160.40622037394,
1233.43218971275, 1305.25671937236, 1375.89957570869, 1445.38019987715,
1513.71771318288, 1580.93092234301, 1647.03832466233, 1712.05811312379,
1776.00818139531, 1838.90612875416, 1900.76926493033, 1961.61461487023,
2021.45892342205, 2080.31865994395, 2138.21002283649, 2195.14894400053,
2251.1510932217, 2306.23188248277, 2360.40647020513, 2413.68976542041,
2466.09643187347, 2517.64089205797, 2568.33733118544, 2618.19970108913,
2667.24172406357, 2715.47689664105, 2762.91849330583, 2809.5795701474,
2855.47296845351, 2900.61131824417, 2945.00704174745, 2988.67235681812,
3031.61928030007, 3073.85963133337, 3115.40503460692, 3156.26692355763,
3196.45654351696, 3235.9849548056, 3274.8630357774, 3313.10148581304,
3350.71082826463, 3387.70141335169, 3424.0834210096, 3459.86686369117,
3495.06158912208, 3529.67728301099, 3563.72347171513, 3597.20952486194,
3630.14465792765, 3662.53793477339, 3694.39827013962, 3725.73443209948,
3756.55504447179, 3786.86858919437, 3816.68340865829, 3846.00770800373,
3874.84955737805, 3903.21689415673, 3931.11752512776, 3958.5591286401,
3985.5492567168, 4012.0953371333, 4038.20467546162, 4063.88445708088,
4089.14174915471, 4113.98350257616, 4138.41655388066, 4162.44762712739,
4186.0833357498, 4209.33018437567, 4232.19457061714, 4254.68278683143,
4276.80102185247, 4298.55536269409, 4319.95179622522, 4340.99621081746,
4361.6943979656, 4382.05205388147, 4402.0747810615, 4421.76808982864,
4441.13739984872, 4460.18804162205, 4478.92525795032, 4497.35420537947,
4515.4799556188, 4533.3074969367)), .Names = c("x", "y"), row.names = c(NA,
-173L), class = c("tbl_df", "tbl", "data.frame"))
数据集的前六行:
# A tibble: 6 x 2
x y
<dbl> <dbl>
1 0 0
2 426. 9.28
3 853. 18.5
4 1279. 27.8
5 1705. 37.0
6 2131. 46.2
绘图(testing1$x,testing1$y)
我想拟合一个非线性最小二乘函数。这就是我所拥有的:
a.start <- max(testing1$x)
b.start <- 1e-06
control1 <- nls.control(maxiter= 10000, minFactor= 1e-30, warnOnly= FALSE,tol=1e-05)
nl.reg <- nls(y ~ a * (1-exp(-b * x)),data=testing1,start= list(a=a.start,b=b.start),
control= control1)
当我运行它时,我收到错误说明:
Error in nls(y ~ a * (1 - exp(-b * x)), data = testing1, start = list(a =
a.start, :
number of iterations exceeded maximum of 10000
任何人都有这方面的经验,或者可以使用我提供的数据提供一个可重复的示例以使其适合?任何帮助都会很棒,谢谢!
【问题讨论】:
您可能需要重新考虑您的初始估算。当涉及到起始值时,拟合 nls 模型可能会非常挑剔,而且我认为您没有做您想做的事情。 (你为什么使用 xs 的最大值作为 a 的起始值? - 这不是我要改变的唯一事情,但它是你的起点)。你也可以玩弄控制参数。尝试提高 maxiter 和/或降低 tol 以至少获得某种收敛,以便您评估模型。 谢谢@Dason 我试图增加 maxiter 并减少 tol ,但仍然没有运气。我对此很陌生,所以如果我问的一些问题听起来很简单,我深表歉意。为了选择 a 的值,您将如何选择该值?我正在使用基于以前提供给我的代码的 x 的最大值,所以不幸的是,我对它的工作原理还没有很好的理解。 【参考方案1】:您的数据看起来非常合适。我认为这可能是“一件好事”,因为一旦实现拟合,算法可能无法计算梯度。 (请注意,关于此问题的值部分之后立即有一个警告。)如果您严重减少迭代次数并使用控制参数warnOnly
,您会发现,无论 a 和b、结果是一样的。残差平方和实际上为零的事实意味着收敛已经达到了最好的程度,即使将迭代限制为 10 次也会发生这种情况!
control1 <- nls.control(maxiter= 10,tol=1e-02, warnOnly=TRUE)
nl.reg <- nls(y ~ a * (1-exp(-b * x)),data=testing1,start= list(a=a.start,b=b.start),
control= control1)
#------------
Warning message:
In nls(y ~ a * (1 - exp(-b * x)), data = testing1, start = list(a = a.start, :
number of iterations exceeded maximum of 10
> nl.reg
Nonlinear regression model
model: y ~ a * (1 - exp(-b * x))
data: testing1
a b
5.599e+03 3.892e-06
residual sum-of-squares: 1.262e-21
Number of iterations till stop: 10
Achieved convergence tolerance: 0.02381
Reason stopped: number of iterations exceeded maximum of 10
【讨论】:
谢谢!不幸的是,我仍然遇到同样的错误。您是否对数据进行了任何不同的操作以使这项工作为您服务?我复制并粘贴了你的,它给了我一个错误:Warning message: In nls(y ~ a * (1 - exp(-b * x)), data = testing1, start = list(a = a.start, : number of iterations exceeded maximum of 10
没关系,没有意识到这只是一条警告消息,而不是错误。一个问题。因为它停在 10 点,还可以吗?
另外,我得到的答案与你的不同。这有意义吗?这是我的答案:a = -2.395e+04
, b=-4.598e-07
; residual sum of squares = 30782010
不,它不会你看到的残差平方和比我见过的要大得多,即使最大迭代次数为 100000。
啊。我一直在听取 Dason 的建议,并为a
选择了一个更合理的起始值。以上是关于NLS 函数 - 迭代次数超过最大值的主要内容,如果未能解决你的问题,请参考以下文章
线程和迭代次数如何影响测试以及 JMeter 的最大值是多少。线程限制