回答編集履歴

16

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

2020/09/29 12:14

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -156,7 +156,15 @@
156
156
 
157
157
  ```
158
158
 
159
+ from decimal import Decimal, ROUND_HALF_UP
160
+
161
+ n0 = next_prediction[0][0]
162
+
163
+ n1 = Decimal(str(n0))
164
+
165
+ n2 = n1.quantize(Decimal('0'), rounding=ROUND_HALF_UP)
166
+
159
- print("次の当選番号の予測は: {}".format(e[round(next_prediction[0][0])]))
167
+ print("次の当選番号の予測は: {}".format(e[n2]))
160
168
 
161
169
  ```
162
170
 

15

2020/09/29 12:14

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -150,13 +150,13 @@
150
150
 
151
151
  next_prediction[0][0]は予測されたインデックスを表しているのですから、
152
152
 
153
- 単純に次のようにすればよいす。
153
+ 単純に次のようにすればよいと思います。
154
154
 
155
155
 
156
156
 
157
157
  ```
158
158
 
159
- print("次の当選番号の予測は: {}".format(e[int(next_prediction[0][0])]))
159
+ print("次の当選番号の予測は: {}".format(e[round(next_prediction[0][0])]))
160
160
 
161
161
  ```
162
162
 

14

回答篇

2020/09/25 11:22

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -144,9 +144,21 @@
144
144
 
145
145
 
146
146
 
147
- 戻し方を明かしちゃうと勉強にならないので、~~明日までに~~考えてみてください。
147
+ ~~戻し方を明かしちゃうと勉強にならないので、明日までに考えてみてください。~~
148
148
 
149
149
 
150
+
151
+ next_prediction[0][0]は予測されたインデックスを表しているのですから、
152
+
153
+ 単純に次のようにすればよいです。
154
+
155
+
156
+
157
+ ```
158
+
159
+ print("次の当選番号の予測は: {}".format(e[int(next_prediction[0][0])]))
160
+
161
+ ```
150
162
 
151
163
  ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
152
164
 

13

2020/09/25 11:17

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -152,4 +152,6 @@
152
152
 
153
153
  あくまでコピペ元のプログラムのアプローチを生かす形での、正しそうな答えを導くためのショートカットを示しただけです。
154
154
 
155
+ (組み合わせをマッピングしたインデックスのトレンドが、組み合わせの予測に使えるかといわれれば、大いに疑問)
156
+
155
157
  たぶん、各数字の出現頻度等を考慮した、もっとまっすぐなアプローチをご存知の方がいるはず。

12

2020/09/24 14:56

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -150,6 +150,6 @@
150
150
 
151
151
  ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
152
152
 
153
- あくまで既存のプログラムを生かす形での、正しそうな答えを導くためのショートカットなアプローチを示しただけです。
153
+ あくまでコピペ元のプログラムのアプローチを生かす形での、正しそうな答えを導くためのショートカットを示しただけです。
154
154
 
155
- たぶんもっとまっすぐなアプローチをご存知の方がいるはず。
155
+ たぶん、各数字の出現頻度等を考慮した、もっとまっすぐなアプローチをご存知の方がいるはず。

11

2020/09/24 14:52

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -68,9 +68,11 @@
68
68
 
69
69
  a = [m for m in range(37)]
70
70
 
71
- d = {tuple(p):i for i, p in enumerate(itertools.combinations(a, 7))}
71
+ #1〜37の数字の組み合わせパターンを登録
72
72
 
73
+ d = {tuple(p): i for i, p in enumerate(itertools.combinations(a, 7))}
74
+
73
- e = {v:k for k, v in d.items()}
75
+ e = {v: k for k, v in d.items()}
74
76
 
75
77
 
76
78
 

10

順列→組み合わせに修正

2020/09/24 14:47

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -64,21 +64,23 @@
64
64
 
65
65
  ```
66
66
 
67
-
68
-
69
67
  import itertools
70
68
 
71
69
  a = [m for m in range(37)]
72
70
 
73
- d = {tuple(p):i for i, p in enumerate(itertools.permutations(a, 7))}
71
+ d = {tuple(p):i for i, p in enumerate(itertools.combinations(a, 7))}
72
+
73
+ e = {v:k for k, v in d.items()}
74
+
75
+
74
76
 
75
77
  #パターンをキーとしてインデックスをマッピングする。
76
78
 
77
79
  data = dataframe.index.map(
78
80
 
79
- lambda _:d[
81
+ lambda _:d[ tuple(sorted(
80
82
 
81
- (dataframe.第1数字[_])-1 ,
83
+ [(dataframe.第1数字[_])-1 ,
82
84
 
83
85
  (dataframe.第2数字[_])-1 ,
84
86
 
@@ -91,6 +93,10 @@
91
93
  (dataframe.第6数字[_])-1 ,
92
94
 
93
95
  (dataframe.第7数字[_])-1
96
+
97
+ ]
98
+
99
+ ))
94
100
 
95
101
  ]
96
102
 
@@ -126,13 +132,13 @@
126
132
 
127
133
  Test Score: 0.187 RMSE
128
134
 
129
- 次の当選番号の予測は: 87750434816
135
+ 次の当選番号の予測は: 5597193.5
130
136
 
131
137
  Time: 3.3sec
132
138
 
133
139
  ```
134
140
 
135
- で、あとは出てきた答え(上で言えば「87750434816」)を、各数字に戻せばよい。
141
+ で、あとは出てきたnext_prediction(上で言えば「5597193.5」)を、求めるべきこたえに戻せばよい。
136
142
 
137
143
 
138
144
 

9

s

2020/09/24 14:46

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  a = [m for m in range(37)]
72
72
 
73
- d = {tuple(p):i for i, p in itertools.permutations(a, 7)}
73
+ d = {tuple(p):i for i, p in enumerate(itertools.permutations(a, 7))}
74
74
 
75
75
  #パターンをキーとしてインデックスをマッピングする。
76
76
 

8

2020/09/24 14:22

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- 一方、LOTO7は37までの数字を使用ています。
49
+ 一方、LOTO7は1から37までの数字を7つ、重複なに選択るものです
50
50
 
51
51
 
52
52
 
@@ -72,7 +72,7 @@
72
72
 
73
73
  d = {tuple(p):i for i, p in itertools.permutations(a, 7)}
74
74
 
75
-
75
+ #パターンをキーとしてインデックスをマッピングする。
76
76
 
77
77
  data = dataframe.index.map(
78
78
 

7

2020/09/24 14:16

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -52,9 +52,9 @@
52
52
 
53
53
  したがって、仮に上記のように2桁で区切ってデータを与えても、
54
54
 
55
- **内部では10,29,2までの数が書かれたサイコロを仮定して出る目を予測することにな
55
+ **内部では、(データによるが)最大で3736333331までの数が書かれたサイコロを仮定して出る目を予測することになってしまい
56
56
 
57
- 考えべきパターンを取りこぼしてしまう**ため、
57
+ 実際に存在するパターン以外のパターンで計算に使可能性がある**ため、
58
58
 
59
59
  正しそうな答えを導くことはできないのではないでしょうか。
60
60
 

6

2020/09/24 14:14

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  したがって、仮に上記のように2桁で区切ってデータを与えても、
54
54
 
55
- **内部では37373737373737までの数が書かれたサイコロを仮定して出る目を予測することになり、
55
+ **内部では10,295,472までの数が書かれたサイコロを仮定して出る目を予測することになり、
56
56
 
57
57
  考えるべきパターンを取りこぼしてしまう**ため、
58
58
 
@@ -60,31 +60,39 @@
60
60
 
61
61
 
62
62
 
63
- そこで、出来る限り同じアプローチ(プログラムを変えずにやるという意味で)でやるという前提に立てば
64
-
65
- 下記のように37進法の数字を、10進数に線形にあてはめた数字をデータとして投入する、というやり方になるかもしれませんね。
63
+ そこで、ロト7の全パターンを、10進数に線形にあてはめた数字をデータとして投入する、というやり方になるかもしれませんね。
66
64
 
67
65
  ```
68
66
 
67
+
68
+
69
+ import itertools
70
+
71
+ a = [m for m in range(37)]
72
+
73
+ d = {tuple(p):i for i, p in itertools.permutations(a, 7)}
74
+
75
+
76
+
69
77
  data = dataframe.index.map(
70
78
 
71
- lambda _:int(
79
+ lambda _:d[
72
80
 
73
- (dataframe.第1数字[_]-1)*(37**0) +
81
+ (dataframe.第1数字[_])-1 ,
74
82
 
75
- (dataframe.第2数字[_]-1)*(37**1) +
83
+ (dataframe.第2数字[_])-1 ,
76
84
 
77
- (dataframe.第3数字[_]-1)*(37**2) +
85
+ (dataframe.第3数字[_])-1 ,
78
86
 
79
- (dataframe.第4数字[_]-1)*(37**3) +
87
+ (dataframe.第4数字[_])-1 ,
80
88
 
81
- (dataframe.第5数字[_]-1)*(37**4) +
89
+ (dataframe.第5数字[_])-1 ,
82
90
 
83
- (dataframe.第6数字[_]-1)*(37**5) +
91
+ (dataframe.第6数字[_])-1 ,
84
92
 
85
- (dataframe.第7数字[_]-1)*(37**6)
93
+ (dataframe.第7数字[_])-1
86
94
 
87
- )
95
+ ]
88
96
 
89
97
  )
90
98
 

5

2020/09/24 14:12

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -38,11 +38,11 @@
38
38
 
39
39
  0〜9で成り立っていることを奇貨として、
40
40
 
41
- 3つの数を10進法で最大3桁となる整数yに変換し、各時点xに対するyの動きを分析・予測するものです。
41
+ 3つの数を10進法で最大3桁となる整数yに変換し、各時点xに対するyを線形にプロットしたグラフを分析・予測するものです。
42
42
 
43
43
 
44
44
 
45
- イメージしやすい言い方をすれば、**000から999の数字が書かれた「1000面体のサイコロ」を振って出た目の過去の記録を分析して、次に振って出る目を予測している**のです。
45
+ イメージしやすい言い方をすれば、**000から999の数字が書かれた「1000面体のサイコロ」を振って出た目の過去の記録を分析して、次に振って出る目を予測している**のです。(実際は実数で計算しているので語弊はありますが)
46
46
 
47
47
 
48
48
 
@@ -52,19 +52,11 @@
52
52
 
53
53
  したがって、仮に上記のように2桁で区切ってデータを与えても、
54
54
 
55
- **内部では1010101010101から37373737373737までの「連続が書かれた36363636363637面のサイコロを仮定して出る目を予測することになり、
55
+ **内部では37373737373737までの数が書かれたサイコロを仮定して出る目を予測することになり、
56
56
 
57
- 予測段階でこの世界では異端とな38以上の数扱うとになってしまう**ため、
57
+ 考えべきパターン取りぼしてしまう**ため、
58
58
 
59
- 正しそうな答えを導くことはできません
59
+ 正しそうな答えを導くことはできないのではないでしょうか
60
-
61
- (元となるデータに38以上の数字が含まれていなくとも、予測計算段階でその前提が崩れる)
62
-
63
-
64
-
65
- 一見いいアイデアだと思ったのに。。。残念!
66
-
67
-
68
60
 
69
61
 
70
62
 

4

2020/09/24 13:42

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  0〜9で成り立っていることを奇貨として、
40
40
 
41
- 3つの数を3桁yに変換し、各時点xに対する3桁の数字yの動きを分析・予測するものです。
41
+ 3つの数を10進法で最大3桁となる整数yに変換し、各時点xに対するyの動きを分析・予測するものです。
42
42
 
43
43
 
44
44
 

3

2020/09/24 13:35

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  元のプログラムは、3つの数字データを元に予測するものですが、
36
36
 
37
- 日本で発売されている数字選択式全国自治宝くじのひとつである「NUMBERS31」が使う各数字が
37
+ 日本で発売されている数字選択式全国自治宝くじのひとつである「NUMBERS3」が使う各数字が
38
38
 
39
39
  0〜9で成り立っていることを奇貨として、
40
40
 

2

2020/09/24 13:34

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  (dataframe.第3数字[_]-1)*(37**2) +
86
86
 
87
- (dataframe.第4数字[_]-1)*(37**3)+
87
+ (dataframe.第4数字[_]-1)*(37**3) +
88
88
 
89
89
  (dataframe.第5数字[_]-1)*(37**4) +
90
90
 

1

c

2020/09/24 13:32

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -78,19 +78,19 @@
78
78
 
79
79
  lambda _:int(
80
80
 
81
- (dataframe.第1数字[_]-1)*37**0 +
81
+ (dataframe.第1数字[_]-1)*(37**0) +
82
82
 
83
- (dataframe.第2数字[_]-1)*37**1 +
83
+ (dataframe.第2数字[_]-1)*(37**1) +
84
84
 
85
- (dataframe.第3数字[_]-1)*37**2 +
85
+ (dataframe.第3数字[_]-1)*(37**2) +
86
86
 
87
- (dataframe.第4数字[_]-1)*37**3 +
87
+ (dataframe.第4数字[_]-1)*(37**3)+
88
88
 
89
- (dataframe.第5数字[_]-1)*37**4 +
89
+ (dataframe.第5数字[_]-1)*(37**4) +
90
90
 
91
- (dataframe.第6数字[_]-1)*37**5 +
91
+ (dataframe.第6数字[_]-1)*(37**5) +
92
92
 
93
- (dataframe.第7数字[_]-1)*37**6
93
+ (dataframe.第7数字[_]-1)*(37**6)
94
94
 
95
95
  )
96
96
 
@@ -140,4 +140,8 @@
140
140
 
141
141
 
142
142
 
143
+ ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。
144
+
143
- ※私は数学に詳しくないので、このアプローチが本当に正しい答えを導くかどうかについては保証しません。あくまで既存のプログラムを生かす形での、正しそうな答えを導くためのショートカットなアプローチを示しただけです。
145
+ あくまで既存のプログラムを生かす形での、正しそうな答えを導くためのショートカットなアプローチを示しただけです。
146
+
147
+ たぶんもっとまっすぐなアプローチをご存知の方がいるはず。