べんきのにっき

いろいろと垂れ流します。

パーセンタイル的なあれを数値的に計算する

なんとなく、パーセンタイルって数値的に計算できないのかなと思った。

二回微分計算しようと思ったけど、一回微分で符号関数出てくるし、もう一回微分したらデルタ関数になりそうだし、そしたら逆行列なくなりそうな気がしてやめた。

線形計画法で解いた方がいいらしいけど知らん。

#適当にデータを作る
yvec <- runif(100)
#何%点か
tau<- 0.4
#計算されたパーセンタイル
mu<- 0

learning_rate <- 0.1
# 長さ
n <- length(yvec)
for(i in 1:50){
  #残差
  resd<-yvec-mu
  #一回微分
  #わざわざ符号関数を使って描くとこうなるけど、別に下側の式で良い。
  #mu_new <- sum(abs(tau-(resd<0))*sign(resd))/n
  mu_new <- sum(tau-(resd<0))/n
  #目的関数(いらないけど)
  #objF<- sum((tau-(resd<0))*resd)/n
  #更新
  mu <- mu + learning_rate*(mu_new)
}

これで、resdの部分を線形推定量なんかにしたら、回帰にできるね。 さらに言うと、とても性質の良い正則化項なら簡単に追加できる。

SNCDなる方法で、elastic netな方法もできるらしい。 読んでみたところ、coordinate descentで、アルゴリズムもしっかり解説してくれてたので、頑張れば作れそうだった。