質問編集履歴
5
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,35 +1,5 @@
|
|
1
|
-
### 前提・実現したいこと
|
2
|
-
https://qiita.com/phyblas/items/d756803ec932ab621c56
|
3
|
-
こちらのサイトを参考にして、特定済みの2次元データからRBFカーネルのパラメータを予測したいです。
|
4
|
-
特定済みの値をそのままx0,y0に代入して実行したところ、エラーが出てしまいました。
|
5
|
-
### 発生している問題・エラーメッセージ
|
6
|
-
---------------------------------------------------------------------------
|
7
|
-
AttributeError Traceback (most recent call last)
|
8
|
-
<ipython-input-63-3d592025a82f> in <module>()
|
9
|
-
11 for i in [0,1]:
|
10
|
-
12 if(i):
|
11
|
-
---> 13 gp.saitekika(x0,y0,1000) # パラメータを調整する
|
12
|
-
14 plt.subplot(211+i)
|
13
|
-
15 plt.plot(x0,y0,'. ')
|
14
|
-
|
15
|
-
1 frames
|
16
|
-
<ipython-input-62-54f0617fec3e> in saitekika(self, x0, y0, kurikaeshi)
|
17
|
-
49 n_param = len(param)
|
18
|
-
50 theta0 = np.log(param)
|
19
|
-
---> 51 p0 = self.logyuudo(param)
|
20
|
-
52 lis_theta = []
|
21
|
-
53 lis_p = []
|
22
|
-
|
23
|
-
<ipython-input-62-54f0617fec3e> in logyuudo(self, param)
|
24
|
-
39 k00 = self.kernel(*np.meshgrid(self.x0,self.x0))
|
25
|
-
40 k00_1 = np.linalg.inv(k00)
|
26
|
-
---> 41 return -(np.linalg.slogdet(k00)[1]+self.y0.dot(k00_1.dot(self.y0)))
|
27
|
-
|
1
|
+
コード
|
28
|
-
43 def saitekika(self,x0,y0,kurikaeshi=1000): # パラメータを調整して学習
|
29
|
-
|
30
|
-
AttributeError: 'tuple' object has no attribute 'dot'
|
31
|
-
|
32
|
-
|
2
|
+
```
|
33
3
|
import numpy as np
|
34
4
|
import matplotlib.pyplot as plt
|
35
5
|
|
@@ -159,7 +129,63 @@
|
|
159
129
|
plt.title('a=%.3f, s=%.3f, w=%.3f'%tuple(gp.kernel.param))
|
160
130
|
plt.tight_layout()
|
161
131
|
plt.show()
|
132
|
+
```
|
133
|
+
コード
|
134
|
+
```### 前提・実現したいこと
|
135
|
+
https://qiita.com/phyblas/items/d756803ec932ab621c56
|
136
|
+
こちらのサイトを参考にして、特定済みの2次元データからRBFカーネルのパラメータを予測したいです。
|
137
|
+
特定済みの値をそのままx0,y0に代入して実行したところ、エラーが出てしまいました。
|
138
|
+
### 発生している問題・エラーメッセージ
|
139
|
+
---------------------------------------------------------------------------
|
140
|
+
AttributeError Traceback (most recent call last)
|
141
|
+
<ipython-input-63-3d592025a82f> in <module>()
|
142
|
+
11 for i in [0,1]:
|
143
|
+
12 if(i):
|
144
|
+
---> 13 gp.saitekika(x0,y0,1000) # パラメータを調整する
|
145
|
+
14 plt.subplot(211+i)
|
146
|
+
15 plt.plot(x0,y0,'. ')
|
162
147
|
|
148
|
+
1 frames
|
149
|
+
<ipython-input-62-54f0617fec3e> in saitekika(self, x0, y0, kurikaeshi)
|
150
|
+
49 n_param = len(param)
|
151
|
+
50 theta0 = np.log(param)
|
152
|
+
---> 51 p0 = self.logyuudo(param)
|
153
|
+
52 lis_theta = []
|
154
|
+
53 lis_p = []
|
155
|
+
|
156
|
+
<ipython-input-62-54f0617fec3e> in logyuudo(self, param)
|
157
|
+
39 k00 = self.kernel(*np.meshgrid(self.x0,self.x0))
|
158
|
+
40 k00_1 = np.linalg.inv(k00)
|
159
|
+
---> 41 return -(np.linalg.slogdet(k00)[1]+self.y0.dot(k00_1.dot(self.y0)))
|
160
|
+
42
|
161
|
+
43 def saitekika(self,x0,y0,kurikaeshi=1000): # パラメータを調整して学習
|
162
|
+
|
163
|
+
AttributeError: 'tuple' object has no attribute 'dot'
|
164
|
+
|
165
|
+
### 該当のソースコード
|
166
|
+
|
167
|
+
n = 7 # 既知の点の数
|
168
|
+
x0 = (0,5,10,20,25,33,50) # 既知の点
|
169
|
+
y0 = (156,152,148,135,156,145,158)
|
170
|
+
param0 = [10,5,1] # パラメータの初期値
|
171
|
+
bound = [[1e-2,1e2],[1e-2,1e2],[1e-2,1e2]] # 下限上限
|
172
|
+
kernel = Kernel(param0,bound)
|
173
|
+
x1 = np.linspace(0,50,200)
|
174
|
+
gp = Gausskatei(kernel)
|
175
|
+
gp.gakushuu(x0,y0) # パラメータを調整せずに学習
|
176
|
+
plt.figure(figsize=[5,8])
|
177
|
+
for i in [0,1]:
|
178
|
+
if(i):
|
179
|
+
gp.saitekika(x0,y0,1000) # パラメータを調整する
|
180
|
+
plt.subplot(211+i)
|
181
|
+
plt.plot(x0,y0,'. ')
|
182
|
+
mu,std = gp.yosoku(x1)
|
183
|
+
plt.plot(x1,mu,'g')
|
184
|
+
plt.fill_between(x1,mu-std,mu+std,alpha=0.2,color='g')
|
185
|
+
plt.title('a=%.3f, s=%.3f, w=%.3f'%tuple(gp.kernel.param))
|
186
|
+
plt.tight_layout()
|
187
|
+
plt.show()
|
188
|
+
|
163
189
|
### 試したこと
|
164
190
|
|
165
191
|
turpleがdotに反応しないことはわかりましたが、どうすればよいか全くわからず、何も試せておりません。
|
4
タグ変更
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
3
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -53,7 +53,7 @@
|
|
53
53
|
k10 = k01.T
|
54
54
|
k11 = kernel(*np.meshgrid(x1,x1))
|
55
55
|
|
56
|
-
|
56
|
+
|
57
57
|
mu = k10.dot(k00_1.dot(y0))
|
58
58
|
sigma = k11 - k10.dot(k00_1.dot(k01))
|
59
59
|
|
2
コード補足
title
CHANGED
File without changes
|
body
CHANGED
@@ -30,6 +30,39 @@
|
|
30
30
|
AttributeError: 'tuple' object has no attribute 'dot'
|
31
31
|
|
32
32
|
### 該当のソースコード
|
33
|
+
import numpy as np
|
34
|
+
import matplotlib.pyplot as plt
|
35
|
+
|
36
|
+
class RBFkernel:
|
37
|
+
def __init__(self,*param):
|
38
|
+
self.param = list(param)
|
39
|
+
|
40
|
+
def __call__(self,x1,x2):
|
41
|
+
a,s,w = self.param
|
42
|
+
return a**2*np.exp(-((x1-x2)/s)**2) + w*(x1==x2)
|
43
|
+
|
44
|
+
x0 = (0,5,10,20,25,33,50)
|
45
|
+
y0 = (156,152,148,135,156,145,158)
|
46
|
+
x1 = np.linspace(0,50,201)
|
47
|
+
|
48
|
+
kernel = RBFkernel(10,5,3) # 適当なパラメータを使うカーネル関数
|
49
|
+
|
50
|
+
k00 = kernel(*np.meshgrid(x0,x0))
|
51
|
+
k00_1 = np.linalg.inv(k00) # 逆行列
|
52
|
+
k01 = kernel(*np.meshgrid(x0,x1,indexing='ij'))
|
53
|
+
k10 = k01.T
|
54
|
+
k11 = kernel(*np.meshgrid(x1,x1))
|
55
|
+
|
56
|
+
# ここでは上述の方程式の通りのμとΣ
|
57
|
+
mu = k10.dot(k00_1.dot(y0))
|
58
|
+
sigma = k11 - k10.dot(k00_1.dot(k01))
|
59
|
+
|
60
|
+
plt.scatter(x0,y0,c='#ff77aa')
|
61
|
+
plt.plot(x1,mu,'g') # 推測された平均
|
62
|
+
std = np.sqrt(sigma.diagonal()) # 各点の標準偏差は共分散行列の対角成分
|
63
|
+
plt.fill_between(x1,mu-std,mu+std,alpha=0.2,color='g') # 推測された標準偏差の中の領域
|
64
|
+
plt.show()
|
65
|
+
|
33
66
|
class Kernel:
|
34
67
|
def __init__(self,param,bound=None):
|
35
68
|
self.param = np.array(param)
|
1
コードとエラーメッセージ補足
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,11 +3,108 @@
|
|
3
3
|
こちらのサイトを参考にして、特定済みの2次元データからRBFカーネルのパラメータを予測したいです。
|
4
4
|
特定済みの値をそのままx0,y0に代入して実行したところ、エラーが出てしまいました。
|
5
5
|
### 発生している問題・エラーメッセージ
|
6
|
+
---------------------------------------------------------------------------
|
6
|
-
|
7
|
+
AttributeError Traceback (most recent call last)
|
8
|
+
<ipython-input-63-3d592025a82f> in <module>()
|
9
|
+
11 for i in [0,1]:
|
10
|
+
12 if(i):
|
11
|
+
---> 13 gp.saitekika(x0,y0,1000) # パラメータを調整する
|
12
|
+
14 plt.subplot(211+i)
|
13
|
+
15 plt.plot(x0,y0,'. ')
|
7
14
|
|
15
|
+
1 frames
|
16
|
+
<ipython-input-62-54f0617fec3e> in saitekika(self, x0, y0, kurikaeshi)
|
17
|
+
49 n_param = len(param)
|
18
|
+
50 theta0 = np.log(param)
|
19
|
+
---> 51 p0 = self.logyuudo(param)
|
20
|
+
52 lis_theta = []
|
21
|
+
53 lis_p = []
|
22
|
+
|
23
|
+
<ipython-input-62-54f0617fec3e> in logyuudo(self, param)
|
24
|
+
39 k00 = self.kernel(*np.meshgrid(self.x0,self.x0))
|
25
|
+
40 k00_1 = np.linalg.inv(k00)
|
26
|
+
---> 41 return -(np.linalg.slogdet(k00)[1]+self.y0.dot(k00_1.dot(self.y0)))
|
27
|
+
42
|
28
|
+
43 def saitekika(self,x0,y0,kurikaeshi=1000): # パラメータを調整して学習
|
29
|
+
|
30
|
+
AttributeError: 'tuple' object has no attribute 'dot'
|
31
|
+
|
8
32
|
### 該当のソースコード
|
33
|
+
class Kernel:
|
9
|
-
|
34
|
+
def __init__(self,param,bound=None):
|
35
|
+
self.param = np.array(param)
|
36
|
+
if(bound==None):
|
37
|
+
bound = np.zeros([len(param),2])
|
38
|
+
bound[:,1] = np.inf
|
39
|
+
self.bound = np.array(bound)
|
10
40
|
|
41
|
+
def __call__(self,x1,x2):
|
42
|
+
a,s,w = self.param
|
43
|
+
return a**2*np.exp(-0.5*((x1-x2)/s)**2) + w**2*(x1==x2)
|
44
|
+
|
45
|
+
class Gausskatei:
|
46
|
+
def __init__(self,kernel):
|
47
|
+
self.kernel = kernel
|
48
|
+
|
49
|
+
def gakushuu(self,x0,y0): # パラメータを調整せず学習
|
50
|
+
self.x0 = x0
|
51
|
+
self.y0 = y0
|
52
|
+
self.k00 = self.kernel(*np.meshgrid(x0,x0))
|
53
|
+
self.k00_1 = np.linalg.inv(self.k00)
|
54
|
+
|
55
|
+
def yosoku(self,x): # xからyを予測
|
56
|
+
k00_1 = self.k00_1
|
57
|
+
k01 = self.kernel(*np.meshgrid(self.x0,x,indexing='ij'))
|
58
|
+
k10 = k01.T
|
59
|
+
k11 = self.kernel(*np.meshgrid(x,x))
|
60
|
+
mu = k10.dot(k00_1.dot(self.y0))
|
61
|
+
sigma = k11 - k10.dot(k00_1.dot(k01))
|
62
|
+
std = np.sqrt(sigma.diagonal())
|
63
|
+
return mu,std
|
64
|
+
|
65
|
+
def logyuudo(self,param=None): # 対数尤度
|
66
|
+
if(param is None):
|
67
|
+
k00 = self.k00
|
68
|
+
k00_1 = self.k00_1
|
69
|
+
else:
|
70
|
+
self.kernel.param = param
|
71
|
+
k00 = self.kernel(*np.meshgrid(self.x0,self.x0))
|
72
|
+
k00_1 = np.linalg.inv(k00)
|
73
|
+
return -(np.linalg.slogdet(k00)[1]+self.y0.dot(k00_1.dot(self.y0)))
|
74
|
+
|
75
|
+
def saitekika(self,x0,y0,kurikaeshi=1000): # パラメータを調整して学習
|
76
|
+
self.x0 = x0
|
77
|
+
self.y0 = y0
|
78
|
+
param = self.kernel.param
|
79
|
+
logbound = np.log(self.kernel.bound)
|
80
|
+
s = (logbound[:,1]-logbound[:,0])/10.
|
81
|
+
n_param = len(param)
|
82
|
+
theta0 = np.log(param)
|
83
|
+
p0 = self.logyuudo(param)
|
84
|
+
lis_theta = []
|
85
|
+
lis_p = []
|
86
|
+
for i in range(kurikaeshi):
|
87
|
+
idou = np.random.normal(0,s,n_param)
|
88
|
+
hazure = (theta0+idou<logbound[:,0])|(theta0+idou>logbound[:,1])
|
89
|
+
while(np.any(hazure)):
|
90
|
+
idou[hazure] = np.random.normal(0,s,n_param)[hazure]
|
91
|
+
hazure = (theta0+idou<logbound[:,0])|(theta0+idou>logbound[:,1])
|
92
|
+
theta1 = theta0 + idou
|
93
|
+
param = np.exp(theta1)
|
94
|
+
p1 = self.logyuudo(param)
|
95
|
+
r = np.exp(p1-p0)
|
96
|
+
if(r>=1 or r>np.random.random()):
|
97
|
+
theta0 = theta1
|
98
|
+
p0 = p1
|
99
|
+
lis_theta.append(theta0)
|
100
|
+
lis_p.append(p0)
|
101
|
+
self.ar_theta = np.array(lis_theta)
|
102
|
+
self.ar_p = np.array(lis_p)
|
103
|
+
self.kernel.param = np.exp(lis_theta[np.argmax(lis_p)])
|
104
|
+
self.k00 = self.kernel(*np.meshgrid(x0,x0))
|
105
|
+
self.k00_1 = np.linalg.inv(self.k00)
|
106
|
+
|
107
|
+
|
11
108
|
n = 7 # 既知の点の数
|
12
109
|
x0 = (0,5,10,20,25,33,50) # 既知の点
|
13
110
|
y0 = (156,152,148,135,156,145,158)
|