回答編集履歴

8

update result message

2022/10/14 06:40

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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: ", p0 := np.random.randint(1, 10, size = 4))
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

2022/10/14 06:39

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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 = [np.random.randint(1, 10)] * 4)
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

2022/10/13 21:03

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/13 09:24

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/13 09:21

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/13 09:15

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/13 09:08

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/13 09:05

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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(np.array(cov)).sum(), min_cov)
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
  ```