非线性拟合

(1)第一小题

主要思路:

  1. 先按规定生成数据,并随机选取采样的点【设置随机种子,具有可比性】;
  2. 对其分别用curve_fit和leastsq进行拟合。
  3. 并对不同的h噪声于N采用点的数量多次拟合,得出结论。

结论: 采样点过少拟合的误差很大,选取适当的采样点以及噪声。

初始化值的影响(针对leastsq拟合)

  1. 迭代次数会受到影响,有些时候回出现找不到最优解的情况,即Runtime error。
  2. 若全为零,则无法收敛。【不清楚具体原因】

PS:结果中拟合得到的六个数分别对应:w1,w2,a1,a2,b1,b2.


1
2
3
4
5
6
curve_fit拟合: [2.14069954 0.09444333 0.80681967 2.54152869 1.4323823  0.19961187]
rmseTrain: 0.26232178776291626
rmseTest: 0.18205567968308098
leastsq拟合: [-3.87720452 -1.86011704 1.11854247 1.16788575 -1.04915769 0.79268749]
rmseTrain: 0.26429049990284564
rmseTest: 0.18608879973399017
1
2
3
4
5
6
7
curve_fit拟合: [ 0.2408062   2.91612327  1.23109954 -0.03553431  0.45438827  2.25150756]
rmseTrain: 0.2761896128805953
rmseTest: 0.17399649531553602
leastsq拟合: [ -2.17240752 10.4348742 0.87428228 -30.76492902 -1.42103926
-0.97720794]
rmseTrain: 0.27848961091065344
rmseTest: 0.1737385154786153
1
2
3
4
5
6
7
curve_fit拟合: [-0.32623604  2.15315625  1.41562053  1.12582623  0.50731064  1.0224723 ]
rmseTrain: 0.282580308684162
rmseTest: 0.31526037040858185
leastsq拟合: [ -69.65799634 -2.95866311 -109.80769737 0.86341004 168.29283316
-1.53932051]
rmseTrain: 0.2830336972922693
rmseTest: 0.3147838987502938

(2)第二小题

和第一小题相似的思路,进行求解。此题我用的都是leastsq进行求解。

结论: 当超参数K在超过20以后,过拟合的风险很大,在很多次情况下都出现了最后发散的情况,且通过分析结果可以发现最优解常常出现在K=15左右。

PS:结果中拟合得到的矩阵分别对应K个参数。最终求总体最优解K的时候,K遍历了1~30.。

【h=0.3,N=100】

K = 15的时候其对应的参数值为(在所有的图中最优)

1
2
3
4
5
6
leastsq拟合: [ 7.90943650e-01 -6.07790255e+00  3.40089032e+01 -8.23686304e+01
1.05477246e+02 -7.23628142e+01 1.95321072e+01 5.57225184e+00
-4.12774052e+00 -1.00151354e+00 1.66736526e+00 -6.90740502e-01
1.45205493e-01 -1.59276567e-02 7.27046559e-04]
rmseTrain: 0.2542274166735575
rmseTest: 0.3192894171457426

总体最优:

1
optimal result: trainRMSE=0.2528564533183719,K=19

【h=0.3,N=300】

K = 10的时候最优:

1
2
3
4
5
leastsq拟合: [ 5.12963557e-01  1.40887396e+00 -1.10781790e+01  3.22315658e+01
-4.44401511e+01 3.33253262e+01 -1.44297097e+01 3.60636603e+00
-4.83266327e-01 2.68884577e-02]
rmseTrain: 0.27528636920045013
rmseTest: 0.25770065713597756

总体最优:

1
optimal result: trainRMSE=0.2812570739349669,K=13

【h=0.1,N=100】

K = 15的时候最优:

1
2
3
4
5
6
leastsq拟合: [ 6.60552408e-01 -4.02527344e+00  2.30410493e+01 -5.46928875e+01
6.69070375e+01 -4.29674450e+01 1.15661941e+01 3.10549348e-01
1.28865085e+00 -2.74964237e+00 1.70011749e+00 -5.49201917e-01
1.01626117e-01 -1.02609900e-02 4.40780742e-04]
rmseTrain: 0.07841776983416013
rmseTest: 0.06016607491515813

总体最优:

1
optimal result: trainRMSE=0.07898375450702452,K=13

【h=0.1,N=300】

K=15的时候最优:

1
2
3
4
5
6
leastsq拟合: [ 3.96417862e-01  1.27325013e+00 -4.73253349e+00  8.70217397e+00
-2.30403125e+00 -1.52860038e+01 2.54845292e+01 -1.89155325e+01
6.98733737e+00 -5.94285184e-01 -5.72936217e-01 2.64631449e-01
-5.28312267e-02 5.26214966e-03 -2.11610332e-04]
rmseTrain: 0.27732017692692773
rmseTest: 0.30649315630282625

总体最优:

1
optimal result: RMSE=0.09689352955521495,K=15

(3)第三小题

这题需要注意的是其参数的个数总共应该有K *(M+1)+2个,所以在初始化参数矩阵的时候需要设置成对应的维数,且第t[K*(M+1)], t[K*(M+1)+1]分别对应的是ai,bi.

此题遍历了K(1~5),M(1~5)。在拟合过程中,往往已经到达maxfev了还没有得到最优解,所以将maxfev设置成5000,但是到后面内存会炸... ...因此图也就只画了最优解:

【h=0.2,N=100】

1
2
3
4
5
6
7
8
optimal result:0.17873822672400802,K=4,M=4
拟合参数为(wij,ai,bi): [-5.23038785e+01 1.18052581e+02 5.45720103e+01 6.73970159e+01
-1.97437971e+02 -1.42252056e+02 -5.82180336e+01 -4.27695564e+01
9.18709021e+01 -1.74421852e+02 8.30403724e+01 -3.78627087e+01
2.28423291e+02 4.96400605e+01 5.97721900e+02 1.00678402e+02
1.23770905e+01 -4.21183888e+02 -3.21158789e+01 -2.94345001e+02
-2.27769369e+00 -1.29106345e+00 -8.45080274e-02 -2.97361883e-01
4.17302005e-01]

【h=0.2,N=300】

1
2
3
optimal result:0.18118763840270755,K=1,M=4
拟合参数为(wij,ai,bi): [ 1.06746926 -0.23354976 2.17369779 -2.09387451 0.84513304 0.33436772
0.87670918 -0.6949209 0.5154138 -1.11487105]

【h=0.2,N=1000】

1
2
3
optimal result:0.19286880337431161,K=1,M=4
拟合参数为(wij,ai,bi): [ -8.09035471 -9.53448948 -29.17412061 21.14867643 -16.45334841
-2.31546224 -1.34575906 0.21633296 -1.31420103 -0.24180187

【h=0.5,N=100】

1
2
3
4
optimal result:0.43966680795335106,K=1,M=4
拟合参数为(wij,ai,bi): [-2.67613022e+02 4.41099471e+02 -5.74683063e+02 1.02026656e+03
-5.72899644e+02 -7.29986181e+00 -7.36054845e-01 1.39984394e+00
-7.81911683e-01 -4.37508983e-01]

【h=0.5,N=300】

1
2
3
4
optimal result:0.4681035667876177,K=2,M=4
拟合参数为(wij,ai,bi): [299.78797515 28.87566283 -49.79908816 8.91462082 -1.8215882
298.53012447 27.46238369 -81.20025633 9.62740177 2.38413704
39.09115188 15.30831486 1.46089238 0.5924728 1.19783084]

【h=0.5,N=1000】

1
2
3
4
optimal result:0.489592101202918,K=1,M=4
拟合参数为(wij,ai,bi): [-7.69013200e+03 -1.79048782e+05 2.63642290e+05 -2.51621936e+05
4.04690946e+04 -1.03663719e+01 -2.47965800e+00 2.16332958e-01
-1.31420103e+00 -2.41801865e-01]

结论: 当采样点高到1000个的时候,拟合曲线极其平滑,且K与M大多分别取在1和4附近,能得到最优解。噪声越高,也会使得RMSE变高,精度下降。


(4)第四小题

噪声和采样点数的影响与前三小题类似。

curve_fit拟合对应的分别为a,b,c.

1
2
3
curve_fit拟合: [0.38197691 0.60783395 0.26275028]
rmseTrain: 0.20056951038840645
rmseTest: 0.20317551977817713

若将b设置成10000,则有

1
2
3
curve_fit拟合: [-0.01377563  0.36384608]
rmseTrain: 0.2993405343270346
rmseTest: 0.29352661180630557

由结果知:a = -0.01377563,c = 0.36384608.且RMSE在测试集和训练集上均增加


(5)第五小题

对于(2)-(4)的三种模型,选取验证集上RMSE最小的,计算对应模型在测试集上的RMSE:

设置的h=0.3,N=500

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
-------Model1------
rmseTrain: 0.290052586241592
rmseCheck: 0.27685893060069033
rmseTest: 0.29482945312589964
-------Model2------
rmseTrain: 0.5209075125582714
rmseCheck: 0.509217190063768
rmseTest: 0.5711414271483303
-------Model3------
rmseTrain: 0.2961863452096645
rmseCheck: 0.2863578974670555
rmseTest: 0.3048874158254555

可见第二小题对应的模型比第四小题的模型略胜一筹,第三小题的模型相对误差较大。