パーセンタイル的なあれを数値的に計算する
なんとなく、パーセンタイルって数値的に計算できないのかなと思った。
二回微分計算しようと思ったけど、一回微分で符号関数出てくるし、もう一回微分したらデルタ関数になりそうだし、そしたら逆行列なくなりそうな気がしてやめた。
線形計画法で解いた方がいいらしいけど知らん。
#適当にデータを作る 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で、アルゴリズムもしっかり解説してくれてたので、頑張れば作れそうだった。