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

質問編集履歴

5

書式の改善

2020/10/05 00:28

投稿

mizu103
mizu103

スコア1

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
- 42
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

タグ変更

2020/10/05 00:28

投稿

mizu103
mizu103

スコア1

title CHANGED
File without changes
body CHANGED
File without changes

3

書式の改善

2020/10/02 00:36

投稿

mizu103
mizu103

スコア1

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

コード補足

2020/09/30 06:30

投稿

mizu103
mizu103

スコア1

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

コードとエラーメッセージ補足

2020/09/30 06:29

投稿

mizu103
mizu103

スコア1

title CHANGED
File without changes
body CHANGED
@@ -3,11 +3,108 @@
3
3
  こちらのサイトを参考にして、特定済みの2次元データからRBFカーネルのパラメータを予測したいです。
4
4
  特定済みの値をそのままx0,y0に代入して実行したところ、エラーが出てしまいました。
5
5
  ### 発生している問題・エラーメッセージ
6
+ ---------------------------------------------------------------------------
6
- https://qiita.com/phyblas/items/d756803ec932ab621c56
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
- 上記urlの「カーネルとガウス過程のクラスを定義します。」の箇所は共通です。それ以降のコードを記します。
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)