(Y-Xb)'(Y-Xb)+lamda||b||
如果用梯度下降,该怎么确定下降方向,最后的结果又是不是一定收敛呢?
(Y-Xb)'(Y-Xb)+lamda||b||
如果用梯度下降,该怎么确定下降方向,最后的结果又是不是一定收敛呢?
绝对值函数在0的位置不可导,所以应该不是梯度下降。如果我没记错,应该是线性规划吧。
回复 第1楼 的 lolo:建议先看Tibshirani最初在1996年的那篇论文,里面是将绝对值展开为线性约束;之后貌似又有一种LARS算法,多搜一搜应该也能找到。R软件中可以用lars包或glmnet包实现。
楼上正解。LP是最早的算法,因为太慢所以LASSO一直没流行起来,知道EFRON2004年提出LARS - least angle regression,将LASSO的算法的复杂度降低到一个最小二乘回归的复杂度。。并且能一次输出所有的解(每个LAMBDA有一个解)。当然,很多时候我们不需要所有的解。于是friedmen就一直使用block coordinate descent algorithm,也叫shooting algorithm,后来又有变种active shooting。这些其实都是梯度下降+block coordinate descent。根据block coordinate descent algorithm的原理,只要每一个iteration都有唯一解,这个算法最终会收敛,所以,LASSO的算法解决已经不是问题了。
回复 第4楼 的 lovelyday:版主好强,从哪学到这些知识的,可否指点小弟一下。我就是对机器学习很有兴趣,但是有时候不知往哪个方向去努力。有些资料也不是看的很懂
这个不太属于机器学习吧。。属于统计学习或者统计方法更恰当一点。毕竟这方面的文章都是发在那几个传统的统计杂志上的。
指点不敢说,我也还在学习这套理论,目前LASSO这块进展不是那么大了,但是还是有很多令人期待的问题没有解决,所以还是有很多坑可以去填的。要想好好学习这块的话,先读那几篇state-of-the-art的文章,如下:
最基本那篇
http://www-stat.stanford.edu/~tibs/lasso.html
yuan ming 然后提出的 group lasso
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.79.2062
zou hui的elastic net,可以同时自动选取相关程度比较大的变量(LASSO不能)
http://www-stat.stanford.edu/~hastie/TALKS/enet_talk.pdf
zou hui 提出的adative lasso,试图避免lasso对参数的shrunkage
http://www.stat.umn.edu/~hzou/Papers/adaLasso.pdf
jianqing fan 2001 年提出的另外一种 nonconvex的惩罚项 -- SCAD
http://www.orfe.princeton.edu/~jqfan/papers/01/penlike.pdf
其学生08年时接着解决了SCAD的算法问题 -- 实际上就是一种adaptive lasso
http://www.stat.umn.edu/~hzou/Papers/onestep.pdf
这方面文献太多了,我给的这几篇是影响比较大的,你可以看看08年这篇的reference,在里面可以找到一些有意思的线索。另外,LASSO还被广泛应用在graphical model上,有兴趣可以看看这篇
http://www.stats.ox.ac.uk/~meinshau/consistent.pdf
http://arxiv.org/abs/0811.4463
http://www-stat.stanford.edu/~tibs/ftp/graph.pdf
这三篇是目前文献里公认的里程碑式的文章--关于gaussian graphical model的。
0 < alpha < 1
...
> library('quantmod')
> library('plyr')
> library('tidyverse')
> library('glmnet')
>
> getSymbols(AAPL)
> AAPLDT <- AAPL %>% as.data.frame %>% data.frame(rownames(.), .) %>% tbl_df
>
> #h(x) 函数将yj设为多维xjwj,wj是加权矢量。
> h <- function() {
AAPLDT_DF <- AAPLDT[, 1:5] %>% gather(Category, Price, AAPL.Open:AAPL.Close) %>%
mutate(Date = factor(Date), Category =
factor(Category,
levels = c('AAPL.Open', 'AAPL.High', 'AAPL.Low', 'AAPL.Close')),
wt = 1, b0 = Price / first(Price))
#'@ contrasts(AAPLDT_DF$Date) <- contr.treatment(AAPLDT_DF$Date)
#'@ attr(AAPLDT_DF$Category, 'levels') <- c('AAPL.Open', 'AAPL.High', 'AAPL.Low', 'AAPL.Close')
tmp <- model.matrix(Date ~ Category + Price + wt + b0, data = AAPLDT_DF) %>%
data.frame(Date = AAPLDT$Date, .) %>% tbl_df
return(tmp)
}
> x <- h()
> y <- ddply(x, .(Date), summarise,
resp = sum(((Price * wt * b0) - Price)^2) / nrow(x)) %>% tbl_df
xy <- join(x, y) %>% tbl_df
contrasts
函数怎么设置,才能使。Also, x0=1 has been added to make equation (2) valid. model.matrix(Date ~ Category + Price + wt + b0, data = AAPLDT_DF)
,僕将Date设为分类好让第一天的‘开市’、‘最高’、‘最低’与‘闭市’价格成为基点变量。不过却发现设置后竟然只有第一天的‘开市价’才是基点而非多维基点。
> filter(xy, Date == first(Date))
# A tibble: 4 × 9
Date X.Intercept. CategoryAAPL.High CategoryAAPL.Low CategoryAAPL.Close Price wt b0 resp
<date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2007-01-03 1 0 0 0 86.29 1 1.0000000 0.002306251
2 2007-01-03 1 1 0 0 86.58 1 1.0033608 0.002306251
3 2007-01-03 1 0 1 0 81.90 1 0.9491250 0.002306251
4 2007-01-03 1 0 0 1 83.80 1 0.9711439 0.002306251
contrasts
看了那么久还是不晓得怎么运用... :plain: :plain: :plain: