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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python

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

Q&A

1回答

13928閲覧

Numpyでのエラー…shapes (1,2) and (1,1) not aligned: 2 (dim 1) != 1 (dim 0)

aaa-1

総合スコア13

Python

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

0グッド

0クリップ

投稿2018/12/03 12:18

前提・実現したいこと

Pythonで準ニュートン法の実装をしています。
以下のようなエラーが出たのですが
どう直せばよいのでしょうか?

y = np.matrix(-(dsc_f(x_1,x_2)[0]) + dsc_f(pre_x_1,pre_x_2)[0], -(dsc_f(x_1,x_2)[1]) + dsc_f(pre_x_1,pre_x_2)[1]).T #-dsc_f(x_1, x_2)+dsc_f(pre_x_1,pre_x_2)とするとbad operand type for unary -: 'tuple'となったので

がよくないのかなと考えてみたのですがあまりうまくいかず…

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-166-10dbead19cdf> in <module>() 29 30 #準(quasi-)ニュートン法~初期値a ---> 31 QNa_1,QNa_2 = q_newton(1.2, 1.2, 0.1, 0.1, 0.1) 32 print(QNa_1,QNa_2) 33 #準(quasi-)ニュートン法~初期値b <ipython-input-166-10dbead19cdf> in q_newton(x_1, x_2, a_0, c, p) 18 s = np.matrix([x_1 - pre_x_1,x_2-pre_x_2]).T 19 y = np.matrix(-(dsc_f(x_1,x_2)[0]) + dsc_f(pre_x_1,pre_x_2)[0], -(dsc_f(x_1,x_2)[1]) + dsc_f(pre_x_1,pre_x_2)[1]).T ---> 20 B = B-(B * s *(B * s).T) / (s.T * B * s) + (y * y.T) / (s.T * y) #BFGS更新公式 21 d = np.linalg.solve(B,g) 22 while (f(x_1 + a * d[0],x_2 + a * d[1]) > f(x_1,x_2) - c * a * abs(np.linalg.norm(d))):#armijoの条件 ~\Anaconda3\lib\site-packages\numpy\matrixlib\defmatrix.py in __mul__(self, other) 213 if isinstance(other, (N.ndarray, list, tuple)) : 214 # This promotes 1-D vectors to row vectors --> 215 return N.dot(self, asmatrix(other)) 216 if isscalar(other) or not hasattr(other, '__rmul__') : 217 return N.dot(self, other) ValueError: shapes (1,2) and (1,1) not aligned: 2 (dim 1) != 1 (dim 0)

該当のソースコード

Python

1def q_newton(x_1,x_2,a_0,c,p): 2 eps = 1e-5 3 h_1 = [x_1,] #x_1のhistory 4 h_2 = [x_2,] 5 pre_x_1,pre_x_2 = x_1,x_2 #更新公式でs=x_k+1-x_kを使うので 6 B = np.matrix(hessian(x_1,x_2)) 7 g = np.array(dsc_f(x_1,x_2)) 8 d = np.linalg.solve(B,g) 9 x_1, x_2 = [x_1 + d[0],x_2 + d[1]] 10 h_1.append(x_1) 11 h_2.append(x_2) 12 iteration_max = 50 13 a = a_0 14 for i in range(iteration_max): 15 if (np.linalg.norm(dsc_f(x_1,x_2)) < eps): #停止条件 16 break 17 else: 18 s = np.matrix([x_1 - pre_x_1,x_2-pre_x_2]).T 19 y = np.matrix(-(dsc_f(x_1,x_2)[0]) + dsc_f(pre_x_1,pre_x_2)[0], -(dsc_f(x_1,x_2)[1]) + dsc_f(pre_x_1,pre_x_2)[1]).T 20 #-dsc_f(x_1, x_2)+dsc_f(pre_x_1,pre_x_2)とするとbad operand type for unary -: 'tuple'となったので 21 B = B-(B * s *(B * s).T) / (s.T * B * s) + (y * y.T) / (s.T * y) #BFGS更新公式 22 d = np.linalg.solve(B,g) 23 while (f(x_1 + a * d[0],x_2 + a * d[1]) > f(x_1,x_2) - c * a * abs(np.linalg.norm(d))):#armijoの条件 24 a = a * p #↑をみたすように小さくしていく 25 pre_x_1,pre_x_2 = [x_1,x_2] 26 x_1,x_2 = [x_1 + a * d[0], x_2 + a * d[1]] 27 h_1.append(x_1) 28 h_2.append(x_2) 29 return h_1 - 1,h_2 -1 30 31#準(quasi-)ニュートン法~初期値a 32QNa_1,QNa_2 = q_newton(1.2, 1.2, 0.1, 0.1, 0.1) 33print(QNa_1,QNa_2) 34#準(quasi-)ニュートン法~初期値b 35QNb_1,QNb_2 = q_newton(-1.2, 1, 0.1, 0.1, 0.1) 36print(QNa_1,QNa_2)

試したこと

各成分に分解すると出来る

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

numpy.matrixは数学の行列を表すクラスです.そのエラーは行列の掛け算を行う際に発生するエラーです.
行列の掛け算ではかける数の行数とかけられる数の列数が一致していないと,掛け算が行えません.
今回のエラーはそれらの数が一致していないため,発生しています.今一度,各行列の列数と行数を確認することをお勧めします.

投稿2018/12/03 16:18

RS-offline

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問