首页 > 解决方案 > 错误的 scipy 拟合,即使初始猜测良好

问题描述

要拟合的模型是方程

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]and popt=[0.42994105],这几乎是相同的值。为什么该curve_fit功能在这种情况下不起作用?

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

标签: pythoncurve-fitting

解决方案


这里没有什么太神秘的事情发生。0.4299... 在最小二乘意义上更适合数据。

b = 0.1,前几个点完全不适合。最小二乘法对异常值有很大的权重,因此优化器会非常努力地更好地拟合那些异常值,即使这意味着在其他点上做得稍差。换句话说,“大多数”点“非常好”地拟合,并且非常糟糕地拟合任何点都会受到非常高的惩罚(这就是最小二乘法中的“平方”)。

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

具有各种参数的数据与模型


推荐阅读