Scipy での最適化
最小の RSS 値を求める解析的解を、numpy で実装することは可能です。しかし、より複雑なモデルでは解析式が求まらないため、別の方法に頼る必要があります。
この演習では、同じ最適化問題をより一般的な手法で解くために、scipy.optimize を使います。
その過程で、「最良解がどれくらい良いか」を教えてくれる追加の戻り値も確認します。ここでは比較しやすいように、前の演習と同じ観測データとパラメータを使って、新しい scipy のアプローチを試します。
この演習はコースの一部です
Pythonで学ぶ線形モデリング入門
演習の手順
- 配列
xを受け取りa0 + a1*xを返す関数model_func(x, a0, a1)を定義します。 scipyの関数optimize.curve_fit()を使って、a0とa1の最適値を計算します。param_optをアンパックし、モデルパラメータをa0 = param_opt[0]、a1 = param_opt[1]として保存します。- 事前定義済みの関数
compute_rss_and_plot_fitを使って、解をテストし検証します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Define a model function needed as input to scipy
def model_func(x, a0, a1):
return ____ + (____*x)
# Load the measured data you want to model
x_data, y_data = load_data()
# call curve_fit, passing in the model function and data; then unpack the results
param_opt, param_cov = optimize.curve_fit(____, x_data, y_data)
a0 = param_opt[0] # a0 is the intercept in y = a0 + a1*x
a1 = param_opt[1] # a1 is the slope in y = a0 + a1*x
# test that these parameters result in a model that fits the data
fig, rss = compute_rss_and_plot_fit(____, ____)