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

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

新規登録して質問してみよう
ただいま回答率
85.48%
最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

0回答

1260閲覧

rosenbrock関数の最適化,多次元になると解けません。

退会済みユーザー

退会済みユーザー

総合スコア0

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2020/10/19 12:15

前提・実現したいこと

現在、rosenbrock関数をニュートン法で解いています。
2変数の場合は解けましたが、それ以上になると正解にたどり着けません。
以下のプログラムは5変数で作成しています。
正解になるようにプログラムを修正したいのですが
どこが間違っているのか分かりません。
分かる方いらっしゃればよろしくお願いします。

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

出力結果[0.96746637 0.93582304 0.87533204 0.71405052 0.50986815] 正解は[1,1,1,1,1]になります。 正解に近づくように訂正したいです。

該当のソースコード

python

1 2from mpl_toolkits.mplot3d import Axes3D 3from matplotlib import cm 4from matplotlib.ticker import LinearLocator, FormatStrFormatter 5import matplotlib.pyplot as plt 6import numpy as np 7 8H=np.zeros((5,5)) 9nabura=np.zeros(5) 10 11def f1(x1,x2,x3,x4,x5): 12 return 100*(x1**2-x2)**2+(x1-1)**2+100*(x2**2-x3)**2+(x2-1)**2+100*(x3**2-x4)**2+(x3-1)**2+100*(x4**2-x5)**2+(x4-1)**2 13 14def inverse_hesse_f1(x1x2x3x4x5): 15 x1=x1x2x3x4x5[0] 16 x2=x1x2x3x4x5[1] 17 x3=x1x2x3x4x5[2] 18 x4=x1x2x3x4x5[3] 19 x5=x1x2x3x4x5[4] 20 21 H[0,0]=100*(12*x1**2-4*x2)+2 22 for i in range(1,4): 23 H[i,i]=100*2+100*(12*x2**2-4*x3+2) 24 H[4,4]=100*2 25 26 for i in range(4): 27 H[i+1,i]=100*(-4*x1) 28 for i in range(4): 29 H[i,i+1]=100*(-4*x1) 30 31 try: 32 return np.linalg.inv(H) 33 except: 34 return np.array([[None, None,None,None,None], 35 [None, None,None,None,None], 36 [None, None,None,None,None], 37 [None, None,None,None,None], 38 [None, None,None,None,None]]) 39 40def gradient_f1(x1x2x3x4x5): 41 x1=x1x2x3x4x5[0] 42 x2=x1x2x3x4x5[1] 43 x3=x1x2x3x4x5[2] 44 x4=x1x2x3x4x5[3] 45 x5=x1x2x3x4x5[4] 46 47 nabura[0]=100*(4*x1**3-4*x1*x2)+2*x1-2 48 49 for i in range(1,4): 50 nabura[i]=100*(-2*x1**2+2*x2)+100*(4*x2**3-4*x2*x3)+2*x2-2 51 52 nabura[4]=100*(-2*x4**2+2*x5) 53 54 return nabura 55 56def gradient_descent_method(gradient_f, inverse_hesse_f, init_pos, learning_rate): 57 eps = 1e-10 58 59 init_pos = np.array(init_pos) 60 pos = init_pos 61 pos_history = [init_pos] 62 iteration_max = 100 63 64 for i in range(iteration_max): 65 66 print(i+1, ":", pos) 67 68 pos_new = pos - learning_rate * inverse_hesse_f(pos).dot(gradient_f(pos)) 69 70 if abs(np.linalg.norm(pos - pos_new)) < eps: 71 break 72 73 pos = pos_new 74 pos_history.append(pos) 75 76 77 return (pos, np.array(pos_history)) 78 79def main(): 80 learning_rates = [ 1 ] 81 82 for i, learning_rate in enumerate(learning_rates): 83 ans, pos_history = gradient_descent_method(gradient_f1, inverse_hesse_f1, (2,2,2,2,2) , learning_rate) 84 85main()

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

toast-uz

2020/10/21 13:12 編集

多次元のrosenbrock関数の安定解を求めるのは難しそうで、20次元では様々なアルゴリズムのベンチマークになっているようです。一方、ニュートン法は最も基本的な安定解の探索アルゴリズムだと思いますが、5次元のrosenbrock関数の安定解をニュートン法にて実用に求めるような、論文やWeb記事はありますでしょうか?
退会済みユーザー

退会済みユーザー

2020/10/21 16:18

ひとまず5次元は解けました。目標は次元が変わっても対応できるプログラムの完成です。おっしゃっている内容は20次元まで計算可能ということですか?次元をいろいろと変化させて収束性を考察している論文は見つけました。
toast-uz

2020/10/21 22:20

解決されたのですね。それではご自分で回答を記載して解決済みにしてください。 以下ご参考です。 f、gを多次元で実装している例はありました。ただし一部抜粋なのとノイズを入れているので、そのままは使えませんが。 https://naomichi.work/2020/07/24/ こちらは20次元rosenbrock関数を含むいろいろなベンチマーク関数を、アルゴリズムを変えて性能比較している論文です。この手の論文でニュートン法を比較対象に出しているものは見つかりませんでした。 http://www.ir.his.u-fukui.ac.jp/lab/ja/intro/article/h24/c76.pdf
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問