質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1457閲覧

'tuple' object has no attribute 'dot'が解決できません。

mizu103

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/30 06:01

編集2020/10/05 00:28

コード

import numpy as np import matplotlib.pyplot as plt class RBFkernel: def __init__(self,*param): self.param = list(param) def __call__(self,x1,x2): a,s,w = self.param return a**2*np.exp(-((x1-x2)/s)**2) + w*(x1==x2) x0 = (0,5,10,20,25,33,50) y0 = (156,152,148,135,156,145,158) x1 = np.linspace(0,50,201) kernel = RBFkernel(10,5,3) # 適当なパラメータを使うカーネル関数 k00 = kernel(*np.meshgrid(x0,x0)) k00_1 = np.linalg.inv(k00) # 逆行列 k01 = kernel(*np.meshgrid(x0,x1,indexing='ij')) k10 = k01.T k11 = kernel(*np.meshgrid(x1,x1)) mu = k10.dot(k00_1.dot(y0)) sigma = k11 - k10.dot(k00_1.dot(k01)) plt.scatter(x0,y0,c='#ff77aa') plt.plot(x1,mu,'g') # 推測された平均 std = np.sqrt(sigma.diagonal()) # 各点の標準偏差は共分散行列の対角成分 plt.fill_between(x1,mu-std,mu+std,alpha=0.2,color='g') # 推測された標準偏差の中の領域 plt.show() class Kernel: def __init__(self,param,bound=None): self.param = np.array(param) if(bound==None): bound = np.zeros([len(param),2]) bound[:,1] = np.inf self.bound = np.array(bound) def __call__(self,x1,x2): a,s,w = self.param return a**2*np.exp(-0.5*((x1-x2)/s)**2) + w**2*(x1==x2) class Gausskatei: def __init__(self,kernel): self.kernel = kernel def gakushuu(self,x0,y0): # パラメータを調整せず学習 self.x0 = x0 self.y0 = y0 self.k00 = self.kernel(*np.meshgrid(x0,x0)) self.k00_1 = np.linalg.inv(self.k00) def yosoku(self,x): # xからyを予測 k00_1 = self.k00_1 k01 = self.kernel(*np.meshgrid(self.x0,x,indexing='ij')) k10 = k01.T k11 = self.kernel(*np.meshgrid(x,x)) mu = k10.dot(k00_1.dot(self.y0)) sigma = k11 - k10.dot(k00_1.dot(k01)) std = np.sqrt(sigma.diagonal()) return mu,std def logyuudo(self,param=None): # 対数尤度 if(param is None): k00 = self.k00 k00_1 = self.k00_1 else: self.kernel.param = param k00 = self.kernel(*np.meshgrid(self.x0,self.x0)) k00_1 = np.linalg.inv(k00) return -(np.linalg.slogdet(k00)[1]+self.y0.dot(k00_1.dot(self.y0))) def saitekika(self,x0,y0,kurikaeshi=1000): # パラメータを調整して学習 self.x0 = x0 self.y0 = y0 param = self.kernel.param logbound = np.log(self.kernel.bound) s = (logbound[:,1]-logbound[:,0])/10. n_param = len(param) theta0 = np.log(param) p0 = self.logyuudo(param) lis_theta = [] lis_p = [] for i in range(kurikaeshi): idou = np.random.normal(0,s,n_param) hazure = (theta0+idou<logbound[:,0])|(theta0+idou>logbound[:,1]) while(np.any(hazure)): idou[hazure] = np.random.normal(0,s,n_param)[hazure] hazure = (theta0+idou<logbound[:,0])|(theta0+idou>logbound[:,1]) theta1 = theta0 + idou param = np.exp(theta1) p1 = self.logyuudo(param) r = np.exp(p1-p0) if(r>=1 or r>np.random.random()): theta0 = theta1 p0 = p1 lis_theta.append(theta0) lis_p.append(p0) self.ar_theta = np.array(lis_theta) self.ar_p = np.array(lis_p) self.kernel.param = np.exp(lis_theta[np.argmax(lis_p)]) self.k00 = self.kernel(*np.meshgrid(x0,x0)) self.k00_1 = np.linalg.inv(self.k00) n = 7 # 既知の点の数 x0 = (0,5,10,20,25,33,50) # 既知の点 y0 = (156,152,148,135,156,145,158) param0 = [10,5,1] # パラメータの初期値 bound = [[1e-2,1e2],[1e-2,1e2],[1e-2,1e2]] # 下限上限 kernel = Kernel(param0,bound) x1 = np.linspace(0,50,200) gp = Gausskatei(kernel) gp.gakushuu(x0,y0) # パラメータを調整せずに学習 plt.figure(figsize=[5,8]) for i in [0,1]: if(i): gp.saitekika(x0,y0,1000) # パラメータを調整する plt.subplot(211+i) plt.plot(x0,y0,'. ') mu,std = gp.yosoku(x1) plt.plot(x1,mu,'g') plt.fill_between(x1,mu-std,mu+std,alpha=0.2,color='g') plt.title('a=%.3f, s=%.3f, w=%.3f'%tuple(gp.kernel.param)) plt.tight_layout() plt.show()

コード

https://qiita.com/phyblas/items/d756803ec932ab621c56 こちらのサイトを参考にして、特定済みの2次元データからRBFカーネルのパラメータを予測したいです。 特定済みの値をそのままx0,y0に代入して実行したところ、エラーが出てしまいました。 ### 発生している問題・エラーメッセージ --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-63-3d592025a82f> in <module>() 11 for i in [0,1]: 12 if(i): ---> 13 gp.saitekika(x0,y0,1000) # パラメータを調整する 14 plt.subplot(211+i) 15 plt.plot(x0,y0,'. ') 1 frames <ipython-input-62-54f0617fec3e> in saitekika(self, x0, y0, kurikaeshi) 49 n_param = len(param) 50 theta0 = np.log(param) ---> 51 p0 = self.logyuudo(param) 52 lis_theta = [] 53 lis_p = [] <ipython-input-62-54f0617fec3e> in logyuudo(self, param) 39 k00 = self.kernel(*np.meshgrid(self.x0,self.x0)) 40 k00_1 = np.linalg.inv(k00) ---> 41 return -(np.linalg.slogdet(k00)[1]+self.y0.dot(k00_1.dot(self.y0))) 42 43 def saitekika(self,x0,y0,kurikaeshi=1000): # パラメータを調整して学習 AttributeError: 'tuple' object has no attribute 'dot' ### 該当のソースコード n = 7 # 既知の点の数 x0 = (0,5,10,20,25,33,50) # 既知の点 y0 = (156,152,148,135,156,145,158) param0 = [10,5,1] # パラメータの初期値 bound = [[1e-2,1e2],[1e-2,1e2],[1e-2,1e2]] # 下限上限 kernel = Kernel(param0,bound) x1 = np.linspace(0,50,200) gp = Gausskatei(kernel) gp.gakushuu(x0,y0) # パラメータを調整せずに学習 plt.figure(figsize=[5,8]) for i in [0,1]: if(i): gp.saitekika(x0,y0,1000) # パラメータを調整する plt.subplot(211+i) plt.plot(x0,y0,'. ') mu,std = gp.yosoku(x1) plt.plot(x1,mu,'g') plt.fill_between(x1,mu-std,mu+std,alpha=0.2,color='g') plt.title('a=%.3f, s=%.3f, w=%.3f'%tuple(gp.kernel.param)) plt.tight_layout() plt.show() ### 試したこと turpleがdotに反応しないことはわかりましたが、どうすればよいか全くわからず、何も試せておりません。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/09/30 06:03

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください また、エラーメッセージはいらぬ翻訳省略しないで、そのままコピペで提示しましょう
mizu103

2020/09/30 06:24

わかりました。ありがとうございます。修正します。
guest

回答1

0

ベストアンサー

コード表示を編集してくださらないので分かる範囲で回答します。

引用元のサイトでは

Python

1y0 = y(x0) + np.random.normal(0,2,30) # 関数にノイズを加える 2 3(中略) 4 5mu = k10.dot(k00_1.dot(y0))

としているので dot に対し numpy.ndarray を渡してますが

質問者様のコードでは

Python

1y0 = (156,152,148,135,156,145,158) 2 3(中略) 4 5mu = k10.dot(k00_1.dot(self.y0))

としており、 dot に tuple を渡しているからですね。
数値計算の場合は特に必要がない限り numpy.ndarray でやり取りするのがよろしいです。

投稿2020/10/04 06:56

aokikenichi

総合スコア2240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizu103

2020/10/05 00:25

不手際が多くわかりづらくて申し訳ありません。 お答えいただいた通りnumpy.ndarrayで試してみたところうまくいきました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問