はじめに
LARSを説明した記事のつづきです。
LARSアルゴリズムとLasso解
β^ をLasso解とすると、非ゼロ要素 β^j の符号と残差との相関 c^j=xT(y−μ^) との符号は一致している必要がある。
sign(β^j)=sign(c^j)=sj ⋯(∗)
しかし、LARSアルゴリズムは (∗) を必ず満たすとは言えない。d^j=sjwAj とする(wA 等については前回を参照)と βj は
βjnew=β^j+γd^j
で更新されるので、βjnew の符号が変わるのは
γj=−d^jβ^j
のタイミングで、最初にそのような変化が起こるのは
γ~=γj>0min{γj}
が γ^ よりも小さくなるとき。このとき、(∗) を満たせなくなるのでLARSアルゴリズムの解であってもLasso解ではなくなる。
修正版LARS
もし、γ~<γ^なら、予測値ベクトル等の更新に γ~ を使い、
μ^new=μ^+γ~uA
次のステップで説明変数 j~ を A から除いてequiangular vectorを計算、各値を更新すれば良い。こうすることでLasso解を求めることがでる。
Pythonによるフルスクラッチ実装
実装に関しては前回の実装を少しだけ変更すれば良い。Github (minatosato/Lasso)にアップロードしたので参考にしてください。
圧倒的参考資料