即使有很好的初步猜测,也是错误的scipy配合。

问题描述 投票:0回答:1

拟合的模型为方程

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.1p0=1.0在这两种情况下,python都说拟合参数为 popt= [0.42992594]popt=[0.42994105],这几乎是同一个值。为什么 curve_fit 函数在这种情况下不起作用?

popt, pcov = curve_fit(func, xdata, ydata, p0=[0.1])
python curve-fitting
1个回答
2
投票

这里没有什么太神秘的事情。0.4299... 只是在最小二乘法的意义上,对数据的拟合度更好。

有了 b = 0.1前面几个点的拟合度根本就不高。最小二乘法对离群值的权重很高,所以优化器会非常努力地去更好地拟合这些点,即使这意味着在其他点上做得稍差。换句话说,"大多数 "点都能 "很好地拟合",而对于任何一个拟合得很差的点,都会有很高的惩罚(这就是最小二乘法中的 "平方")。

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

Data vs model with various parameters

© www.soinside.com 2019 - 2024. All rights reserved.