teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

16

「銀行家の丸め」にならないように修正

2020/09/29 12:14

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -77,7 +77,11 @@
77
77
  単純に次のようにすればよいと思います。
78
78
 
79
79
  ```
80
+ from decimal import Decimal, ROUND_HALF_UP
81
+ n0 = next_prediction[0][0]
82
+ n1 = Decimal(str(n0))
83
+ n2 = n1.quantize(Decimal('0'), rounding=ROUND_HALF_UP)
80
- print("次の当選番号の予測は: {}".format(e[round(next_prediction[0][0])]))
84
+ print("次の当選番号の予測は: {}".format(e[n2]))
81
85
  ```
82
86
  ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
83
87
  あくまでコピペ元のプログラムのアプローチを生かす形での、正しそうな答えを導くためのショートカットを示しただけです。

15

2020/09/29 12:14

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -74,10 +74,10 @@
74
74
  ~~戻し方を明かしちゃうと勉強にならないので、明日までに考えてみてください。~~
75
75
 
76
76
  next_prediction[0][0]は予測されたインデックスを表しているのですから、
77
- 単純に次のようにすればよいす。
77
+ 単純に次のようにすればよいと思います。
78
78
 
79
79
  ```
80
- print("次の当選番号の予測は: {}".format(e[int(next_prediction[0][0])]))
80
+ print("次の当選番号の予測は: {}".format(e[round(next_prediction[0][0])]))
81
81
  ```
82
82
  ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
83
83
  あくまでコピペ元のプログラムのアプローチを生かす形での、正しそうな答えを導くためのショートカットを示しただけです。

14

回答篇

2020/09/25 11:22

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -71,8 +71,14 @@
71
71
  ```
72
72
  で、あとは出てきたnext_prediction(上で言えば「5597193.5」)を、求めるべきこたえに戻せばよい。
73
73
 
74
- 戻し方を明かしちゃうと勉強にならないので、~~明日までに~~考えてみてください。
74
+ ~~戻し方を明かしちゃうと勉強にならないので、明日までに考えてみてください。~~
75
75
 
76
+ next_prediction[0][0]は予測されたインデックスを表しているのですから、
77
+ 単純に次のようにすればよいです。
78
+
79
+ ```
80
+ print("次の当選番号の予測は: {}".format(e[int(next_prediction[0][0])]))
81
+ ```
76
82
  ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
77
83
  あくまでコピペ元のプログラムのアプローチを生かす形での、正しそうな答えを導くためのショートカットを示しただけです。
78
84
  (組み合わせをマッピングしたインデックスのトレンドが、組み合わせの予測に使えるかといわれれば、大いに疑問)

13

2020/09/25 11:17

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -75,4 +75,5 @@
75
75
 
76
76
  ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
77
77
  あくまでコピペ元のプログラムのアプローチを生かす形での、正しそうな答えを導くためのショートカットを示しただけです。
78
+ (組み合わせをマッピングしたインデックスのトレンドが、組み合わせの予測に使えるかといわれれば、大いに疑問)
78
79
  たぶん、各数字の出現頻度等を考慮した、もっとまっすぐなアプローチをご存知の方がいるはず。

12

2020/09/24 14:56

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -74,5 +74,5 @@
74
74
  戻し方を明かしちゃうと勉強にならないので、~~明日までに~~考えてみてください。
75
75
 
76
76
  ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
77
- あくまで既存のプログラムを生かす形での、正しそうな答えを導くためのショートカットなアプローチを示しただけです。
77
+ あくまでコピペ元のプログラムのアプローチを生かす形での、正しそうな答えを導くためのショートカットを示しただけです。
78
- たぶんもっとまっすぐなアプローチをご存知の方がいるはず。
78
+ たぶん、各数字の出現頻度等を考慮した、もっとまっすぐなアプローチをご存知の方がいるはず。

11

2020/09/24 14:52

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -33,8 +33,9 @@
33
33
  ```
34
34
  import itertools
35
35
  a = [m for m in range(37)]
36
+ #1〜37の数字の組み合わせパターンを登録
36
- d = {tuple(p):i for i, p in enumerate(itertools.combinations(a, 7))}
37
+ d = {tuple(p): i for i, p in enumerate(itertools.combinations(a, 7))}
37
- e = {v:k for k, v in d.items()}
38
+ e = {v: k for k, v in d.items()}
38
39
 
39
40
  #パターンをキーとしてインデックスをマッピングする。
40
41
  data = dataframe.index.map(

10

順列→組み合わせに修正

2020/09/24 14:47

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -31,20 +31,23 @@
31
31
 
32
32
  そこで、ロト7の全パターンを、10進数に線形にあてはめた数字をデータとして投入する、というやり方になるかもしれませんね。
33
33
  ```
34
-
35
34
  import itertools
36
35
  a = [m for m in range(37)]
37
- d = {tuple(p):i for i, p in enumerate(itertools.permutations(a, 7))}
36
+ d = {tuple(p):i for i, p in enumerate(itertools.combinations(a, 7))}
37
+ e = {v:k for k, v in d.items()}
38
+
38
39
  #パターンをキーとしてインデックスをマッピングする。
39
40
  data = dataframe.index.map(
40
- lambda _:d[
41
+ lambda _:d[ tuple(sorted(
41
- (dataframe.第1数字[_])-1 ,
42
+ [(dataframe.第1数字[_])-1 ,
42
43
  (dataframe.第2数字[_])-1 ,
43
44
  (dataframe.第3数字[_])-1 ,
44
45
  (dataframe.第4数字[_])-1 ,
45
46
  (dataframe.第5数字[_])-1 ,
46
47
  (dataframe.第6数字[_])-1 ,
47
48
  (dataframe.第7数字[_])-1
49
+ ]
50
+ ))
48
51
  ]
49
52
  )
50
53
  ```
@@ -62,10 +65,10 @@
62
65
  --
63
66
  Train Score: 0.216 RMSE
64
67
  Test Score: 0.187 RMSE
65
- 次の当選番号の予測は: 87750434816
68
+ 次の当選番号の予測は: 5597193.5
66
69
  Time: 3.3sec
67
70
  ```
68
- で、あとは出てきた答え(上で言えば「87750434816」)を、各数字に戻せばよい。
71
+ で、あとは出てきたnext_prediction(上で言えば「5597193.5」)を、求めるべきこたえに戻せばよい。
69
72
 
70
73
  戻し方を明かしちゃうと勉強にならないので、~~明日までに~~考えてみてください。
71
74
 

9

s

2020/09/24 14:46

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  import itertools
36
36
  a = [m for m in range(37)]
37
- d = {tuple(p):i for i, p in itertools.permutations(a, 7)}
37
+ d = {tuple(p):i for i, p in enumerate(itertools.permutations(a, 7))}
38
38
  #パターンをキーとしてインデックスをマッピングする。
39
39
  data = dataframe.index.map(
40
40
  lambda _:d[

8

2020/09/24 14:22

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  イメージしやすい言い方をすれば、**000から999の数字が書かれた「1000面体のサイコロ」を振って出た目の過去の記録を分析して、次に振って出る目を予測している**のです。(実際は実数で計算しているので語弊はありますが)
24
24
 
25
- 一方、LOTO7は37までの数字を使用ています。
25
+ 一方、LOTO7は1から37までの数字を7つ、重複なに選択るものです
26
26
 
27
27
  したがって、仮に上記のように2桁で区切ってデータを与えても、
28
28
  **内部では、(データによるが)最大で37363534333231までの数が書かれたサイコロを仮定して出る目を予測することになってしまい、
@@ -35,7 +35,7 @@
35
35
  import itertools
36
36
  a = [m for m in range(37)]
37
37
  d = {tuple(p):i for i, p in itertools.permutations(a, 7)}
38
-
38
+ #パターンをキーとしてインデックスをマッピングする。
39
39
  data = dataframe.index.map(
40
40
  lambda _:d[
41
41
  (dataframe.第1数字[_])-1 ,

7

2020/09/24 14:16

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -25,8 +25,8 @@
25
25
  一方、LOTO7は37までの数字を使用しています。
26
26
 
27
27
  したがって、仮に上記のように2桁で区切ってデータを与えても、
28
- **内部では10,29,2までの数が書かれたサイコロを仮定して出る目を予測することにな
28
+ **内部では、(データによるが)最大で3736333331までの数が書かれたサイコロを仮定して出る目を予測することになってしまい
29
- 考えべきパターンを取りこぼしてしまう**ため、
29
+ 実際に存在するパターン以外のパターンで計算に使可能性がある**ため、
30
30
  正しそうな答えを導くことはできないのではないでしょうか。
31
31
 
32
32
  そこで、ロト7の全パターンを、10進数に線形にあてはめた数字をデータとして投入する、というやり方になるかもしれませんね。

6

2020/09/24 14:14

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -25,23 +25,27 @@
25
25
  一方、LOTO7は37までの数字を使用しています。
26
26
 
27
27
  したがって、仮に上記のように2桁で区切ってデータを与えても、
28
- **内部では37373737373737までの数が書かれたサイコロを仮定して出る目を予測することになり、
28
+ **内部では10,295,472までの数が書かれたサイコロを仮定して出る目を予測することになり、
29
29
  考えるべきパターンを取りこぼしてしまう**ため、
30
30
  正しそうな答えを導くことはできないのではないでしょうか。
31
31
 
32
- そこで、出来る限り同じアプローチ(プログラムを変えずにやるという意味で)でやるという前提に立てば
33
- 下記のように37進法の数字を、10進数に線形にあてはめた数字をデータとして投入する、というやり方になるかもしれませんね。
32
+ そこで、ロト7の全パターンを、10進数に線形にあてはめた数字をデータとして投入する、というやり方になるかもしれませんね。
34
33
  ```
34
+
35
+ import itertools
36
+ a = [m for m in range(37)]
37
+ d = {tuple(p):i for i, p in itertools.permutations(a, 7)}
38
+
35
39
  data = dataframe.index.map(
36
- lambda _:int(
40
+ lambda _:d[
37
- (dataframe.第1数字[_]-1)*(37**0) +
41
+ (dataframe.第1数字[_])-1 ,
38
- (dataframe.第2数字[_]-1)*(37**1) +
42
+ (dataframe.第2数字[_])-1 ,
39
- (dataframe.第3数字[_]-1)*(37**2) +
43
+ (dataframe.第3数字[_])-1 ,
40
- (dataframe.第4数字[_]-1)*(37**3) +
44
+ (dataframe.第4数字[_])-1 ,
41
- (dataframe.第5数字[_]-1)*(37**4) +
45
+ (dataframe.第5数字[_])-1 ,
42
- (dataframe.第6数字[_]-1)*(37**5) +
46
+ (dataframe.第6数字[_])-1 ,
43
- (dataframe.第7数字[_]-1)*(37**6)
47
+ (dataframe.第7数字[_])-1
44
- )
48
+ ]
45
49
  )
46
50
  ```
47
51
 

5

2020/09/24 14:12

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -18,21 +18,17 @@
18
18
  元のプログラムは、3つの数字データを元に予測するものですが、
19
19
  日本で発売されている数字選択式全国自治宝くじのひとつである「NUMBERS3」が使う各数字が
20
20
  0〜9で成り立っていることを奇貨として、
21
- 3つの数を10進法で最大3桁となる整数yに変換し、各時点xに対するyの動きを分析・予測するものです。
21
+ 3つの数を10進法で最大3桁となる整数yに変換し、各時点xに対するyを線形にプロットしたグラフを分析・予測するものです。
22
22
 
23
- イメージしやすい言い方をすれば、**000から999の数字が書かれた「1000面体のサイコロ」を振って出た目の過去の記録を分析して、次に振って出る目を予測している**のです。
23
+ イメージしやすい言い方をすれば、**000から999の数字が書かれた「1000面体のサイコロ」を振って出た目の過去の記録を分析して、次に振って出る目を予測している**のです。(実際は実数で計算しているので語弊はありますが)
24
24
 
25
25
  一方、LOTO7は37までの数字を使用しています。
26
26
 
27
27
  したがって、仮に上記のように2桁で区切ってデータを与えても、
28
- **内部では1010101010101から37373737373737までの「連続が書かれた36363636363637面のサイコロを仮定して出る目を予測することになり、
28
+ **内部では37373737373737までの数が書かれたサイコロを仮定して出る目を予測することになり、
29
- 予測段階でこの世界では異端とな38以上の数扱うとになってしまう**ため、
29
+ 考えべきパターン取りぼしてしまう**ため、
30
- 正しそうな答えを導くことはできません
30
+ 正しそうな答えを導くことはできないのではないでしょうか
31
- (元となるデータに38以上の数字が含まれていなくとも、予測計算段階でその前提が崩れる)
32
31
 
33
- 一見いいアイデアだと思ったのに。。。残念!
34
-
35
-
36
32
  そこで、出来る限り同じアプローチ(プログラムを変えずにやるという意味で)でやるという前提に立てば
37
33
  下記のように7桁の37進法の数字を、10進数に線形にあてはめた数字をデータとして投入する、というやり方になるかもしれませんね。
38
34
  ```

4

2020/09/24 13:42

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  元のプログラムは、3つの数字データを元に予測するものですが、
19
19
  日本で発売されている数字選択式全国自治宝くじのひとつである「NUMBERS3」が使う各数字が
20
20
  0〜9で成り立っていることを奇貨として、
21
- 3つの数を3桁yに変換し、各時点xに対する3桁の数字yの動きを分析・予測するものです。
21
+ 3つの数を10進法で最大3桁となる整数yに変換し、各時点xに対するyの動きを分析・予測するものです。
22
22
 
23
23
  イメージしやすい言い方をすれば、**000から999の数字が書かれた「1000面体のサイコロ」を振って出た目の過去の記録を分析して、次に振って出る目を予測している**のです。
24
24
 

3

2020/09/24 13:35

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  元のプログラムは、3つの数字データを元に予測するものですが、
19
- 日本で発売されている数字選択式全国自治宝くじのひとつである「NUMBERS31」が使う各数字が
19
+ 日本で発売されている数字選択式全国自治宝くじのひとつである「NUMBERS3」が使う各数字が
20
20
  0〜9で成り立っていることを奇貨として、
21
21
  3つの数字を3桁の数字yに変換し、各時点xに対する3桁の数字yの動きを分析・予測するものです。
22
22
 

2

2020/09/24 13:34

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -41,7 +41,7 @@
41
41
  (dataframe.第1数字[_]-1)*(37**0) +
42
42
  (dataframe.第2数字[_]-1)*(37**1) +
43
43
  (dataframe.第3数字[_]-1)*(37**2) +
44
- (dataframe.第4数字[_]-1)*(37**3)+
44
+ (dataframe.第4数字[_]-1)*(37**3) +
45
45
  (dataframe.第5数字[_]-1)*(37**4) +
46
46
  (dataframe.第6数字[_]-1)*(37**5) +
47
47
  (dataframe.第7数字[_]-1)*(37**6)

1

c

2020/09/24 13:32

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -38,13 +38,13 @@
38
38
  ```
39
39
  data = dataframe.index.map(
40
40
  lambda _:int(
41
- (dataframe.第1数字[_]-1)*37**0 +
41
+ (dataframe.第1数字[_]-1)*(37**0) +
42
- (dataframe.第2数字[_]-1)*37**1 +
42
+ (dataframe.第2数字[_]-1)*(37**1) +
43
- (dataframe.第3数字[_]-1)*37**2 +
43
+ (dataframe.第3数字[_]-1)*(37**2) +
44
- (dataframe.第4数字[_]-1)*37**3 +
44
+ (dataframe.第4数字[_]-1)*(37**3)+
45
- (dataframe.第5数字[_]-1)*37**4 +
45
+ (dataframe.第5数字[_]-1)*(37**4) +
46
- (dataframe.第6数字[_]-1)*37**5 +
46
+ (dataframe.第6数字[_]-1)*(37**5) +
47
- (dataframe.第7数字[_]-1)*37**6
47
+ (dataframe.第7数字[_]-1)*(37**6)
48
48
  )
49
49
  )
50
50
  ```
@@ -69,4 +69,6 @@
69
69
 
70
70
  戻し方を明かしちゃうと勉強にならないので、~~明日までに~~考えてみてください。
71
71
 
72
+ ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
72
- ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。あくまで既存のプログラムを生かす形での、正しそうな答えを導くためのショートカットなアプローチを示しただけです。
73
+ あくまで既存のプログラムを生かす形での、正しそうな答えを導くためのショートカットなアプローチを示しただけです。
74
+ たぶんもっとまっすぐなアプローチをご存知の方がいるはず。