回答編集履歴
8
update result message
test
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
min_cov = 1e8
|
12
12
|
retry, max_retry = 0, 100
|
13
13
|
while min_cov > 1e-10 and retry < max_retry:
|
14
|
-
print("try init prams:
|
14
|
+
print("try init prams:", p0 := np.random.randint(1, 10, size = 4))
|
15
15
|
param, cov = curve_fit(func, x, y, p0 = p0)
|
16
16
|
min_cov = min(np.abs(cov).sum(), min_cov)
|
17
17
|
retry += 1
|
@@ -21,7 +21,7 @@
|
|
21
21
|
exit()
|
22
22
|
|
23
23
|
print("retried", retry, "times")
|
24
|
-
print(param)
|
24
|
+
print("fitted params:", param)
|
25
25
|
y_fit = func(x, *param)
|
26
26
|
```
|
27
27
|
|
7
append log code
test
CHANGED
@@ -11,7 +11,8 @@
|
|
11
11
|
min_cov = 1e8
|
12
12
|
retry, max_retry = 0, 100
|
13
13
|
while min_cov > 1e-10 and retry < max_retry:
|
14
|
+
print("try init prams: ", p0 := np.random.randint(1, 10, size = 4))
|
14
|
-
param, cov = curve_fit(func, x, y, p0 =
|
15
|
+
param, cov = curve_fit(func, x, y, p0 = p0)
|
15
16
|
min_cov = min(np.abs(cov).sum(), min_cov)
|
16
17
|
retry += 1
|
17
18
|
|
6
fix answer
test
CHANGED
@@ -23,6 +23,8 @@
|
|
23
23
|
print(param)
|
24
24
|
y_fit = func(x, *param)
|
25
25
|
```
|
26
|
-
最小二乗法でうまくいかない理由ですが,元の式を`y = 2 * np.sin(-3 * x + 4) + 5`にして乱数`[1, 10]`の範囲による初期値選択を行うとその片鱗が見えてきます.このときの解は正しくは`[2, -3, 4, 5]`ですが,`-3`は乱数の範囲にないので代わりに`3`が選ばれ,他のパラメータに皺寄せがいく形になり`[-2, 3, 2.28, 5]`となりました.
|
27
26
|
|
27
|
+
### 最小二乗法でうまくいかない理由
|
28
|
+
元の式を`y = 2 * np.sin(-3 * x + 4) + 5`にして乱数`[1, 10]`の範囲による初期値選択を行うとその片鱗が見えてきます.このときの解は正しくは`[2, -3, 4, 5]`ですが,`-3`は乱数の範囲にないので代わりに`3`が選ばれ,他のパラメータに皺寄せがいく形になり`[-2, 3, 2.28, 5]`となりました.
|
29
|
+
|
28
|
-
うまく
|
30
|
+
今回うまくいかなかった理由は,三角関数自体の周期性などによって,「最小二乗法で得られる誤差関数が描く超平面の局所的最適解が多すぎる.」というのが考えられます.質問者はその局所的最適解に陥ったものと思われます.また,大域的最適解も複数存在しており,先述のような別解を得ることになっているものと思われます.
|
5
fix context
test
CHANGED
@@ -23,4 +23,6 @@
|
|
23
23
|
print(param)
|
24
24
|
y_fit = func(x, *param)
|
25
25
|
```
|
26
|
-
最小二乗法でうまくいかない理由ですが,元の式を`y = 2 * np.sin(-3 * x + 4) + 5`にして乱数`[1, 10]`の範囲による初期値選択を行うとその片鱗が見えてきます.このときの解は正しくは`[2, -3, 4, 5]`ですが,`-3`は乱数の範囲にないので代わりに`3`が選ばれ,他のパラメータに皺寄せがいく形になり`[-2, 3, 2.28, 5]`となりました.
|
26
|
+
最小二乗法でうまくいかない理由ですが,元の式を`y = 2 * np.sin(-3 * x + 4) + 5`にして乱数`[1, 10]`の範囲による初期値選択を行うとその片鱗が見えてきます.このときの解は正しくは`[2, -3, 4, 5]`ですが,`-3`は乱数の範囲にないので代わりに`3`が選ばれ,他のパラメータに皺寄せがいく形になり`[-2, 3, 2.28, 5]`となりました.
|
27
|
+
|
28
|
+
うまく説明できませんが,三角関数を苦手とする理由は三角関数自体の周期性によって,「最小二乗法で得られる誤差関数が描く超平面の局所的最適解が多すぎる.」というのがありそうです.質問者はその局所的最適解に陥ったものと思われます.また,大域的最適解も複数存在しており,先述のような別解を得ることになっているものと思われます.
|
4
append answer
test
CHANGED
@@ -23,4 +23,4 @@
|
|
23
23
|
print(param)
|
24
24
|
y_fit = func(x, *param)
|
25
25
|
```
|
26
|
-
最小二乗法でうまくいかない理由ですが,元の式を`y = 2 * np.sin(-3 * x + 4) + 5`にして乱数`[1, 10]`の範囲による初期値選択を行うとその片鱗が見えてきます.このときの解は正しくは`[2, -3, 4, 5]`ですが,`-3`は乱数の範囲にないので代わりに`3`が選ばれ,他のパラメータに皺寄せがいく形になり`[-2, 3, 2.28, 5]`となりました.うまく説明できませんが,三角関数を苦手とする理由は
|
26
|
+
最小二乗法でうまくいかない理由ですが,元の式を`y = 2 * np.sin(-3 * x + 4) + 5`にして乱数`[1, 10]`の範囲による初期値選択を行うとその片鱗が見えてきます.このときの解は正しくは`[2, -3, 4, 5]`ですが,`-3`は乱数の範囲にないので代わりに`3`が選ばれ,他のパラメータに皺寄せがいく形になり`[-2, 3, 2.28, 5]`となりました.うまく説明できませんが,三角関数を苦手とする理由は三角関数自体の周期性によって,最小二乗法で得られる誤差関数が描く超平面の局所的最適解が多すぎる.というのがありそうです.質問者はその局所的最適解に陥ったものと思われます.また,大域的局所最適解も複数存在しており,先述のような別解を得ることになっているものと思われます.
|
3
fixed code
test
CHANGED
@@ -23,3 +23,4 @@
|
|
23
23
|
print(param)
|
24
24
|
y_fit = func(x, *param)
|
25
25
|
```
|
26
|
+
最小二乗法でうまくいかない理由ですが,元の式を`y = 2 * np.sin(-3 * x + 4) + 5`にして乱数`[1, 10]`の範囲による初期値選択を行うとその片鱗が見えてきます.このときの解は正しくは`[2, -3, 4, 5]`ですが,`-3`は乱数の範囲にないので代わりに`3`が選ばれ,他のパラメータに皺寄せがいく形になり`[-2, 3, 2.28, 5]`となりました.うまく説明できませんが,三角関数を苦手とする理由はその周期性にありそうです.
|
2
use numpy
test
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
|
8
8
|
初期値を乱数にして共分散の小さいものを選ぶのも良いかもしれませんね.
|
9
9
|
```Python
|
10
|
+
import numpy as np
|
10
11
|
min_cov = 1e8
|
11
12
|
retry, max_retry = 0, 100
|
12
13
|
while min_cov > 1e-10 and retry < max_retry:
|
1
fixed code
test
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
retry, max_retry = 0, 100
|
12
12
|
while min_cov > 1e-10 and retry < max_retry:
|
13
13
|
param, cov = curve_fit(func, x, y, p0 = [np.random.randint(1, 10)] * 4)
|
14
|
-
min_cov = min(np.abs(
|
14
|
+
min_cov = min(np.abs(cov).sum(), min_cov)
|
15
15
|
retry += 1
|
16
16
|
|
17
17
|
if retry == max_retry:
|
@@ -20,4 +20,5 @@
|
|
20
20
|
|
21
21
|
print("retried", retry, "times")
|
22
22
|
print(param)
|
23
|
+
y_fit = func(x, *param)
|
23
24
|
```
|