前提
下記の手順で最急降下法のアルゴリズムをコード化したいのですが、コードの書き方ができません。どのようにコードを書けばよろしいでしょうか?
- 更新幅 𝛼 ,最大ステップ数 𝑘max ,初期点 𝑥(0) を与える。 𝑘=0 として,手順2に進む。
- 次式にしたがって,探索点 𝑥 を更新する。
𝑥𝑛(𝑘+1)=𝑥𝑛(𝑘)−𝛼∂𝑓(𝑥(𝑘))/∂𝑥𝑛, 𝑛=1,…,𝑁
3. 𝑘=𝑘max であれば終了する。そうでなければ, 𝑘←𝑘+1 として,手順2に戻る。
初期点は (−2,−1) 各パラメータの推奨値は, 𝛼=0.01 , 𝑘max=400 とする。
実現したいこと
最急降下法のアルゴリズムをコード化
該当のソースコード
python
1x1 = -2; x2 = -1 2α = 0.01 3gradient = 0 4k = 0 5 6for k in range(0, 400): 7 gradient = -α * (2 * x1 + 3 * x2) 8 9 if np.abs (gradient) > 400: 10 break 11 k = k + α * gradient -1
試したこと
上記コード
fについてはどうなっていますでしょうか?
𝑓(𝑥)=∑𝑛=12𝑥4𝑛−16𝑥2𝑛+5𝑥𝑛 で
コードとしては、
def f(x):
return x[0] ** 4 - 16 * x[0] ** 2 + 5 * x[0] + x[1] ** 4 - 16 * x[1] ** 2 + 5 * x[1]
情報が不足してしていて申し訳ありません。
変数が2つなんですか?3次元のグラフの話ですか?
変数が2つで3次元のグラフだと思います。
(この問題の目的関数は,後で示す等高線のように非線形性が強いために凹凸状で, 𝑥1 , 𝑥2 軸対称に位置する6個の局所的最適解(コブ:hump)が存在し,このうち 𝑥𝑜≈(±0.08984 , ∓0.71266) (符号同順)が大域的最適解であり,その目的関数値は 𝑓(𝑥𝑜)≈−1.03163 である。)説明が足りず申し訳ありません。
確認ですが、もっと簡単な関数(y = x^2 とか)の場合の最急降下法のコードは書けますか?
import numpy as np
import matplotlib.pyplot as plt
def func(x):
return x**2
def dfunc(x):
df = 2*x
df_abs = np.abs(df)
return df, df_abs
x = 2
alpha = 0.01
k_max = 400
for k in range(1, k_max):
x -= alpha * dfunc(x)[0]
result = np.array([x, dfunc(x)[1]])
print(result)
あってますでしょうか?
> あってますでしょうか?
確認してませんが考え方は合っていると思います。
質問のコードにも上記dfuncのような関数を書けば良いのではないでしょうか?(関数でなくても良いですが)
ご助言いただき、大変ありがとうございます。
上記の関数を参考にやってみたいと思います。
あなたの回答
tips
プレビュー