回答編集履歴

5

softmax_randomからboltzmann_randomに変更

2019/02/28 08:34

投稿

puroko3
puroko3

スコア185

test CHANGED
@@ -78,4 +78,4 @@
78
78
 
79
79
 
80
80
 
81
- softmax_randomに一次元の行動価値の配列を渡して使います。
81
+ boltzmann_randomに一次元の行動価値の配列を渡して使います。

4

色々と無駄があったので修正

2019/02/28 08:34

投稿

puroko3
puroko3

スコア185

test CHANGED
@@ -38,31 +38,9 @@
38
38
 
39
39
 
40
40
 
41
- def softmax(array):
41
+ def boltzmann_random(array, temperature_parameter):
42
42
 
43
- if array.ndim == 2:
44
-
45
- array = array.T
46
-
47
- array = array - np.max(array, axis=0)
48
-
49
- result = np.exp(array) / np.sum(np.exp(array), axis=0)
50
-
51
- return result.T
52
-
53
-
54
-
55
- array = array - np.max(array) # オーバーフロー対策
56
-
57
- return np.exp(array) / np.sum(np.exp(array))
58
-
59
-
60
-
61
- def softmax_random(array, temperature_parameter):
62
-
63
- softmax_array = softmax(array)
64
-
65
- boltzmann_array = boltzmann_distribution(softmax_array, temperature_parameter)
43
+ boltzmann_array = boltzmann_distribution(array, temperature_parameter)
66
44
 
67
45
  random_value = random.uniform(0, 1)
68
46
 
@@ -82,17 +60,17 @@
82
60
 
83
61
  #行動価値
84
62
 
85
- array = np.array([0.5, 0.2, 0.3])
63
+ array = np.array([0.5, 0.3, 0.2])
86
64
 
87
65
  #temperature_parameter = 0であれば最大値のみを選択する
88
66
 
89
- action_index = [softmax_random(array, 0) for _ in range(10000)]
67
+ action_index = [boltzmann_random(array, 0) for _ in range(10000)]
90
68
 
91
69
  print([action_index.count(i) for i in range(len(array))])
92
70
 
93
71
  #temperature_parameterを大きくするほどランダム性が高まる 1であれば行動価値に応じた確率で行動を起こす
94
72
 
95
- action_index = [softmax_random(array, 1) for _ in range(10000)]
73
+ action_index = [boltzmann_random(array, 1) for _ in range(10000)]
96
74
 
97
75
  print([action_index.count(i) for i in range(len(array))])
98
76
 

3

コードの修正

2019/02/28 08:33

投稿

puroko3
puroko3

スコア185

test CHANGED
@@ -62,7 +62,7 @@
62
62
 
63
63
  softmax_array = softmax(array)
64
64
 
65
- boltzmann_array = boltzmann_distribution(array, temperature_parameter)
65
+ boltzmann_array = boltzmann_distribution(softmax_array, temperature_parameter)
66
66
 
67
67
  random_value = random.uniform(0, 1)
68
68
 

2

printデバッグが残ったままだった

2019/02/28 08:27

投稿

puroko3
puroko3

スコア185

test CHANGED
@@ -76,8 +76,6 @@
76
76
 
77
77
  return i
78
78
 
79
- print("ok", i)
80
-
81
79
  return i
82
80
 
83
81
 

1

リスト内包の部分でバグがあったぽいので修正

2019/02/28 08:25

投稿

puroko3
puroko3

スコア185

test CHANGED
@@ -76,6 +76,8 @@
76
76
 
77
77
  return i
78
78
 
79
+ print("ok", i)
80
+
79
81
  return i
80
82
 
81
83
 
@@ -86,11 +88,15 @@
86
88
 
87
89
  #temperature_parameter = 0であれば最大値のみを選択する
88
90
 
91
+ action_index = [softmax_random(array, 0) for _ in range(10000)]
92
+
89
- print([[softmax_random(array, 0) for _ in range(10000)].count(i) for i in range(len(array))])
93
+ print([action_index.count(i) for i in range(len(array))])
90
94
 
91
95
  #temperature_parameterを大きくするほどランダム性が高まる 1であれば行動価値に応じた確率で行動を起こす
92
96
 
97
+ action_index = [softmax_random(array, 1) for _ in range(10000)]
98
+
93
- print([[softmax_random(array, 1) for _ in range(10000)].count(i) for i in range(len(array))])
99
+ print([action_index.count(i) for i in range(len(array))])
94
100
 
95
101
  ```
96
102