誤差を小さくして曲線を当てはめる
多くのモデルは少数のパラメータをもつ曲線で、当てはめとは曲線がデータに近づくようにパラメータを選ぶことです。scipy.optimize.least_squares(fun, x0) がそれを行います。fun(p) はデータ点ごとの残差のベクトルを返す関数で、残差はモデルの値からデータの値を引いたものです。関数はコスト 21∑ri2 を最小にします。出発点 x0 から、ヤコビ行列 J(各パラメータが動くと各残差がどう変わるかの表)を使って進みます。ガウス・ニュートン法の1歩は J⊤Jδ=−J⊤r を解き、パラメータを δ だけ動かします。パラメータについて線形なモデルなら、1歩で答えに着きます。bounds=(下限, 上限) はパラメータを妥当な範囲に保ちます。curve_fit は、モデル f(x,パラメータ) をそのまま渡せる使いやすいラッパーです。
2乗誤差では1つの異常な点が支配的になり、残差 10 は 100 と数えられます。ロバストな損失は、大きな残差に対して増え方がゆるやかです。loss='soft_l1'、f_scale=1 のとき罰則は ρ(z)=2(1+z−1)(z は残差の2乗)です。利回り曲線の当てはめが古典的な使い道です。ネルソン・シーゲル曲線は y(τ)=β0+β1τ/λ1−e−τ/λ+β2(τ/λ1−e−τ/λ−e−τ/λ) で、長期の水準 β0、傾き β1、こぶ β2、年単位の減衰の長さ λ を持ち、4つの数で曲線全体を表します。当てはめ後のノイズの大きさは、n 個の点と p 個のパラメータで s=SSE/(n−p) と推定します。
δ=−(J⊤J)−1J⊤r,cost=21∑ri2,ρ(z)=2(1+z−1),s=n−pSSE(1) 原点を通る直線点
(1,2.1)、
(2,3.9)、
(3,6.2) に
y=ax を当てはめます。
a=1 から始めます。残差は
r=ax−y=(−1.1,−1.9,−3.2)、ヤコビ行列は
J=x=(1,2,3) です。
J⊤r=−14.5、
J⊤J=14 なので
δ=14.5/14=1.036、新しい値は
a=2.036 です。モデルが
a について線形なので、これがすでに答えです。答えでの残差は
0.064、
−0.171、
0.093 で、コストは
0.0211 です。残差
10 は2乗なら
100 ですが、
soft_l1 では
ρ=18.10 にすぎません。実データでは、2026年10月9日の10本の米国債利回り(3か月〜30年)に
least_squares で当てはめたネルソン・シーゲル曲線は、水準
5.75%、傾き
−1.52(満期とともに上昇)、
λ=2.7 年で、気配利回りとのずれは平均
7.3 bp、最悪でも
13 bp です。
SSE=0.54 で
10 点に
4 個のパラメータを当てはめると、自由度は
n−p=6、
s=0.54/6=0.30 です。
- 残差を入れ、パラメータを出す:
fun(p) はモデル引くデータを返し、least_squares は2乗和を小さくする。 - 外れ値にはロバスト損失:
soft_l1 は1つの異常な点が曲線全体を引っ張るのを防ぐ。 - 曲線を4つの数で:ネルソン・シーゲルは利回り曲線を水準・傾き・こぶ・減衰の長さで要約する。
ラボ:採点される内容
- 原点を通る傾き10点
- ガウス・ニュートン法の1歩15点
- ロバストな罰則15点
- 当てはめ後のノイズの大きさ10点
- least_squaresの引数10点
- 曲線当てはめの手順10点
- なぜロバスト損失か30点