質問編集履歴
4
コードを```で囲った
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
混合ガウス分布とEMアルゴリズムでの手書き文字(MNISTデータセット)のクラスタリングを実行しようとしました。
|
2
|
+
Jupyter notebookでpythonを書いたところ、エラーメッセージで```return np.exp(-0.5 * exponents) / np.sqrt(np.linalg.det(self.covs.T).T * (2 * np.pi) ** self.ndim)```
|
2
|
-
|
3
|
+
の部分で(34, 'Result too large')と表示され、オーバーフローによるエラーとわかったのですが、対処方法がわかりません。
|
3
4
|
よろしくお願いいたします。
|
4
5
|
|
5
6
|
以下コードです。
|
3
誤字の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -91,7 +91,7 @@
|
|
91
91
|
joint_prob = self.weights * self.gauss(X)
|
92
92
|
return np.argmax(joint_prob, axis=1)
|
93
93
|
|
94
|
-
|
94
|
+
# MNISTデータセットを実装
|
95
95
|
def main():
|
96
96
|
X = x_0or1
|
97
97
|
|
2
誤字の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
Jupyter notebookでpythonを書いたところ、エラーメッセージで(34, 'Result too large')と表示され、オーバーフローによるエラーとわかったのですが、対処方法がわかりません。
|
3
3
|
よろしくお願いいたします。
|
4
4
|
|
5
|
-
以下コードです。
|
5
|
+
以下コードです。
|
6
6
|
|
7
7
|
```
|
8
8
|
#MNISTデータセットをダウンロード
|
1
コードを```で囲った
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,7 +4,8 @@
|
|
4
4
|
|
5
5
|
以下コードです。なお、文字拡大を防ぐためにここでは#の前に/を入れています。
|
6
6
|
|
7
|
+
```
|
7
|
-
|
8
|
+
#MNISTデータセットをダウンロード
|
8
9
|
import numpy as np
|
9
10
|
from sklearn import datasets
|
10
11
|
from sklearn.preprocessing import StandardScaler
|
@@ -13,42 +14,42 @@
|
|
13
14
|
from sklearn.datasets import fetch_mldata
|
14
15
|
mnist = fetch_mldata('MNIST original')
|
15
16
|
|
16
|
-
|
17
|
+
#MNISTの1~255の数字を1にする
|
17
18
|
_, mnist.data, _, y = train_test_split(mnist.data, y,test_size=0.29)
|
18
19
|
mnist_np = np.array(mnist.data)
|
19
20
|
x_0or1 = np.where(mnist_np >= 1,1, 0)
|
20
21
|
|
21
|
-
|
22
|
+
#アルゴリズムの設定
|
22
23
|
class GaussianMixture(object):
|
23
24
|
|
24
|
-
def
|
25
|
+
def __init__(self,n_component):
|
25
|
-
|
26
|
+
#ガウス分布の個数
|
26
27
|
self.n_component = n_component
|
27
28
|
|
28
|
-
|
29
|
+
#EMアルゴリズムを用いた最尤
|
29
30
|
def fit(self,X,iter_max=10):
|
30
|
-
|
31
|
+
#データの次元
|
31
32
|
self.ndim = np.size(X,1)
|
32
|
-
|
33
|
+
#混合係数の初期化
|
33
34
|
self.weights = np.ones(self.n_component) / self.n_component
|
34
|
-
|
35
|
+
#平均の初期化
|
35
36
|
self.means = np.random.uniform(X.min(),X.max(),(self.ndim,self.n_component))
|
36
|
-
|
37
|
+
#共分散行列の初期化
|
37
38
|
self.covs = np.repeat(10*np.eye(self.ndim),self.n_component).reshape(self.ndim,self.ndim,self.n_component)
|
38
|
-
|
39
|
+
#EステップのMステップを繰り返す
|
39
40
|
for i in range(iter_max):
|
40
41
|
params = np.hstack((self.weights.ravel(), self.means.ravel(), self.covs.ravel()))
|
41
|
-
|
42
|
+
# Eステップ、負担率を計算
|
42
43
|
resps = self.expectation(X)
|
43
|
-
|
44
|
+
# Mステップ、パラメータを更新
|
44
45
|
self.maximization(X, resps)
|
45
|
-
|
46
|
+
# パラメータが収束したかを確認
|
46
47
|
if np.allclose(params, np.hstack((self.weights.ravel(), self.means.ravel(), self.covs.ravel()))):
|
47
48
|
break
|
48
49
|
else:
|
49
50
|
print("parameters may not have converged")
|
50
51
|
|
51
|
-
|
52
|
+
# ガウス関数
|
52
53
|
def gauss(self, X):
|
53
54
|
precisions = np.linalg.inv(self.covs.T).T
|
54
55
|
diffs = X[:, :, None] - self.means
|
@@ -57,35 +58,35 @@
|
|
57
58
|
assert exponents.shape == (len(X), self.n_component)
|
58
59
|
return np.exp(-0.5 * exponents) / np.sqrt(np.linalg.det(self.covs.T).T * (2 * np.pi) ** self.ndim)
|
59
60
|
|
60
|
-
|
61
|
+
# Eステップ
|
61
62
|
def expectation(self, X):
|
62
|
-
|
63
|
+
# PRML式(9.23)
|
63
64
|
resps = self.weights * self.gauss(X)
|
64
65
|
resps /= resps.sum(axis=-1, keepdims=True)
|
65
66
|
return resps
|
66
67
|
|
67
|
-
|
68
|
+
# Mステップ
|
68
69
|
def maximization(self, X, resps):
|
69
|
-
|
70
|
+
# PRML式(9.27)
|
70
71
|
Nk = np.sum(resps, axis=0)
|
71
72
|
|
72
|
-
|
73
|
+
# PRML式(9.26)
|
73
74
|
self.weights = Nk / len(X)
|
74
75
|
|
75
|
-
|
76
|
+
# PRML式(9.24)
|
76
77
|
self.means = X.T.dot(resps) / Nk
|
77
78
|
|
78
79
|
diffs = X[:, :, None] - self.means
|
79
|
-
|
80
|
+
# PRML式(9.25)
|
80
81
|
self.covs = np.einsum('nik,njk->ijk', diffs, diffs * np.expand_dims(resps, 1)) / Nk
|
81
82
|
|
82
|
-
|
83
|
+
# 確率分布p(x)を計算
|
83
84
|
def predict_proba(self, X):
|
84
|
-
|
85
|
+
# PRML式(9.7)
|
85
86
|
gauss = self.weights * self.gauss(X)
|
86
87
|
return np.sum(gauss, axis=-1)
|
87
88
|
|
88
|
-
|
89
|
+
# クラスタリング
|
89
90
|
def classify(self, X):
|
90
91
|
joint_prob = self.weights * self.gauss(X)
|
91
92
|
return np.argmax(joint_prob, axis=1)
|
@@ -109,4 +110,5 @@
|
|
109
110
|
plt.show()
|
110
111
|
|
111
112
|
if __name__ == '__main__':
|
112
|
-
main()
|
113
|
+
main()
|
114
|
+
```
|