即使最初的猜测很好,也不合适

时间:2020-05-19 20:52:45

标签: python curve-fitting

要拟合的模型是方程式

def func(x, b):
   return b*np.exp(-b*x)*(1.0 + b*x)/4.0

我知道b=0.1是对我的数据的一个很好的猜测

0 0.1932332495855138
1 0.0283534527253836
2 0.0188036856033853
3 0.0567007258167565
4 0.0704161703188139
5 0.0276463443409273
6 0.0144509808494943
7 0.0188027609145469
8 0.0049573500626925
9 0.0064589075683206
10 0.0118522499082115
11 0.0087201376939245
12 0.0055855004231049
13 0.0110355379801288
14 0.0024829496736532
15 0.0050982312687186
16 0.0041032075307342
17 0.0063991465281368
18 0.0047195530453669
19 0.0028479431829209
20 0.0177577032522473
21 0.0082863863356967
22 0.0057720347102372
23 0.0053694769677398
24 0.017408417311084
25 0.0023307847797263
26 0.0014090741613788
27 0.0019007144648791
28 0.0043599058193019
29 0.004435997067249
30 0.0015569027316533
31 0.0016127575928092
32 0.00120222948697
33 0.0006851723909766
34 0.0014497504163
35 0.0014245210449107
36 0.0011375555693977
37 0.0007939973846594
38 0.0005707034948325
39 0.0007890519641431
40 0.0006274139241806
41 0.0005899624312505
42 0.0003989619799181
43 0.0002212632688891
44 0.0001465605806698
45 0.000188075040325
46 0.0002779076010181
47 0.0002941294723591
48 0.0001690581072228
49 0.0001448055157076
50 0.0002734759385405
51 0.0003228484365634
52 0.0002120441778252
53 0.0002383276583408
54 0.0002156310534404
55 0.0004499244488764
56 0.0001408465706883
57 0.000135998586104
58 0.00028706917157
59 0.0001788548683777

但是我设置p0=0.1还是p0=1.0都没关系,在两种情况下python的拟合参数都是popt= [0.42992594]popt=[0.42994105],几乎相同的值。为什么curve_fit函数在这种情况下不起作用?

popt, pcov = curve_fit(func, xdata, ydata, p0=[0.1])

1 个答案:

答案 0 :(得分:2)

这里没有什么太神秘的事情了。从最小二乘意义上讲,0.4299 ...更适合数据。

对于b = 0.1,前几点根本不合适。最小二乘会极大地加权离群值,因此优化器会尽力使它们更好地拟合,即使这意味着在其他点上的表现会稍差一些。换句话说,“大多数”点拟合得“很好”,而对任何点的拟合都非常差(这是最小二乘法中的“平方”),因此要付出很高的代价。

下面是数据(蓝色)和模型函数的图,其中b = 0.1b = 0.4299分别为橙色和绿色。 curve_fit返回的值在主观上客观上更好。在这两种情况下,对数据计算MSE都会使用b = 0.1得到大约0.18,使用b = 0.4299得到大约0.13。

Data vs model with various parameters