リッジ回帰
リッジ回帰
最小二乗法では、 近似曲線の次数を高くしたときに元の関数から大きくズレることがあります。 実際にスクリプトで遊んでみると、元の関数には山がひとつしかないのに、 近似関数では山がたくさんあってすごくデコボコした感じになることが確認できると思います。 これを何とかすることはできないでしょうか。
近似関数がデコボコしてしまうのは、関数が複雑すぎるからです。 では、複雑な関数というのはどういう関数でしょう? リッジ回帰では「係数の絶対値が大きければ大きいほど複雑な関数」と考えます。
最小二乗法では、次の式で表される「誤差の総和」を最小にすることが目的でした。
変数の詳細は最小二乗法を確認してください。 これに、「関数の複雑さ」をペナルティとして加えます。
係数の絶対値を直接扱うのは面倒なので、リッジ回帰では係数の二乗を扱います。 λは「誤差の総和」と「関数の複雑さ」のトレードオフを決めるパラメータです。 このような関数の複雑さをペナルティとして与えることを正則化といいます。
Jはすべての点で微分可能なので、最小二乗法のときと同じように、微分して0と置いてみましょう。
整理すると、解かなければならない連立方程式は となります。Iは単位行列です。 この方程式は逆行列を使えば簡単に解けてしまいますね。
実際にやってみる
SVGを使ってグラフを描くJavascriptを作ってみました。 黒い線が元の関数(直線, 2次関数, 三角関数から選択可)、 赤い点が元関数にランダムノイズを加えたもの、 青い線がリッジ回帰によって求めた近似曲線です。 正則化パラメータを大きくするとより簡単な近似関数になるのが確認できると思います。
SVGの描画にはRaphaëlを 行列計算にSylvesterを使用しています。