回答編集履歴

1

追記

2017/11/14 07:30

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -4,11 +4,17 @@
4
4
 
5
5
  import numpy as np
6
6
 
7
+ from math import exp
8
+
7
9
  from scipy.optimize import curve_fit
8
10
 
9
- def f(x, a, b):
11
+ def f1(x, a, b):
10
12
 
11
13
  return a*np.exp(x*x+x+b)
14
+
15
+ def f2(x, c):
16
+
17
+ return c*np.exp(x*x+x)
12
18
 
13
19
 
14
20
 
@@ -18,8 +24,36 @@
18
24
 
19
25
  y = np.random.random(n)
20
26
 
21
- a, b = curve_fit(f, x, y)
27
+ (a, b), cov = curve_fit(f1, x, y)
22
28
 
23
- print(a, b)
29
+ (c), cov = curve_fit(f2, x, y)
30
+
31
+ print('a, b, a*exp(b), c', a, b, a*np.exp(b), c)
32
+
33
+ print('MAE[a,b], MAE[c]', np.mean(np.abs(f1(x, a, b)-y)), np.mean(np.abs(f2(x, c)-y)))
24
34
 
25
35
  ```
36
+
37
+
38
+
39
+ ---
40
+
41
+ 追記:
42
+
43
+ rkhsさんの回答を受けてcに対する最適化問題も追加しました。
44
+
45
+ 比較も残しました。
46
+
47
+
48
+
49
+ cに対して最適化を行うと正しいフィッティングが得られます。
50
+
51
+ a,bに対して行うと、運が良ければ解が一致します。
52
+
53
+ ただし正しくフィッティングできないときもあります。
54
+
55
+
56
+
57
+ やはり余分なパラメータを加えると局所最適解にハマりますね。
58
+
59
+ いろいろと試してみてください。