始める無料で始める

Scipy での最適化

最小の RSS 値を求める解析的解を、numpy で実装することは可能です。しかし、より複雑なモデルでは解析式が求まらないため、別の方法に頼る必要があります。

この演習では、同じ最適化問題をより一般的な手法で解くために、scipy.optimize を使います。

その過程で、「最良解がどれくらい良いか」を教えてくれる追加の戻り値も確認します。ここでは比較しやすいように、前の演習と同じ観測データとパラメータを使って、新しい scipy のアプローチを試します。

この演習はコースの一部です

Pythonで学ぶ線形モデリング入門

コースを見る

演習の手順

  • 配列 x を受け取り a0 + a1*x を返す関数 model_func(x, a0, a1) を定義します。
  • scipy の関数 optimize.curve_fit() を使って、a0a1 の最適値を計算します。
  • 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(____, ____)
コードを編集して実行