LASSOは確率モデルだと係数の事前分布にラプラス分布を指定したものに相当するって話はちょいちょい聞くけど、実際の証明とか実装はどうなってるんだろうなーと思ったので、いくつかのサイトを渡り歩いてみた。
結果としてはホントにラプラス分布指定するだけでいいんだなーと分かった。
実装
https://statmodeling.hatenablog.com/entry/bayesian-lasso より引用
//model_lasso.stan
data{
int N; //標本数
int H; //説明変数の数(切片を除く)
vector[N] y; //目的変数 標準化済み
matrix[N,H] x; // 説明変数 標準化済み
}
parameters{
real w_0;
vector[H] w; //係数パラメータ
real<lower=0> sigma;
real<lower=0> b;
}
transformed parameters{
vector[N] mu;
mu = w_0 + x * w;
}
model{
y ~ normal(mu, sigma);
w ~ double_exponential(0, b);
}
generated quantities{
real log_lambda;
log_lambda = log(sigma^2 / (N * b)); //(7)式
}
SUCRE HECACHA: Bayesian RidgeとBayesian Lasso 通常の正則化回帰との比較
https://rmorita-stat.github.io/2021/01/regularization2/#lasso%E5%9B%9E%E5%B8%B0-1
線形回帰、Ridge、LASSOをStanで実装
確率モデルで表現できることの証明付き
StatModeling Memorandum: Bayesian Lassoで特徴選択
https://statmodeling.hatenablog.com/entry/bayesian-lasso
Stanで線形回帰、正則化項によるLASSO、ラプラス分布によるLASSOの3パターンを実装
最後を除いてtransformed_parametersを使って誤差項を計算し、modelではincrement_log_probを使って誤差の最小化を計っている点がStanっぽくないけど数学的背景に則していて面白い書き方
捨てられたブログ: Stan で Lasso
https://blog.recyclebin.jp/archives/4397
ラプラス分布のパラメータ\(b\)の事前分布に唯一、逆ガンマ分布を利用
該当部分のコードは以下。 lambdaは定数で0.02。
sigma2 ~ inv_gamma(0.001, 0.001);
sigma <- sqrt(sigma2);
beta ~ double_exponential(0, sigma / lambda);
母分散が未知な場合の分散の事前分布が逆ガンマ分布なのが背景か?(参考: 統計ER: 逆ガンマ分布って何?いつ使うの?)
ただ、ラプラス分布の分散は\(2b^2\)なので、こんな感じにした方が実態に則してそう?
variance ~ inv_gamma(0.001, 0.001)
b <- sqrt(variance / 2)
beta ~ double_exponential(0, b)
そもそもStan的には、共役事前分布には拘らないらしい。また、分散のように正の実数を持つ値のモデリング方法として以下を提案している。
- 無情報一様事前分布を
real<lower=0> b
の形式で与える - 弱情報事前分布として指数分布や半正規分布、半コーシー分布などを与える
https://github.com/stan-dev/stan/wiki/Prior-Choice-Recommendations