1. 理论推导

2. 模拟

```set.seed(1)
test_size <- 50
sigma <- 0.5
test_x <- matrix(rnorm(test_size*35,0,1),test_size)
test_y <- ifelse(apply(test_x,1,sum)>0 , 1 , 0)
```

```pnum <- 35
train_error_all <- matrix(NaN,100,pnum)
test_error_all <- matrix(0,100,pnum)
for( i in (1:100)){

flag = 1
while (flag  == 1){
train_x <- matrix(rnorm(50*35,0,1),nrow = 50)
train_y <- ifelse(apply(train_x,1,sum)>0 , 1 , 0)

lasso <- glmnet(train_x,train_y,alpha = 1, nlambda = 10000, family = 'gaussian',pmax = pnum)
lambdas <- data.frame(df = lasso\$df,lambda = lasso\$lambda)
ld <- aggregate(lambdas,by = list(lambdas\$df),mean)

ld <-  ld[-1,]
if(dim(ld)[1] == pnum){
flag = 0
}
}

lasso1 <- glmnet(train_x,train_y,alpha = 1, lambda = ld\$lambda, family = 'gaussian')
result_train <- predict(lasso1, newx = train_x,type = 'response',s = ld\$lambda)
result_test <- predict(lasso1, newx = test_x,type = 'response',s = ld\$lambda)

train_error <- apply(abs(result_train - train_y),2,mean)
test_error <- apply(abs(result_test - test_y),2,mean)

train_error_all[i,ld\$df] <- train_error
test_error_all[i,ld\$df] <- test_error

print(i)
}

train_error_mean <- apply(train_error_all,2,mean)
test_error_mean <- apply(test_error_all,2,mean)
```

```g1 <- ggplot()
saveGIF({
for (i in 1:100){
print(i)
train_data <- data.frame(train_error_all[i,])
train_data\$num <- 1:35
names(train_data) <- c('error','num')
train_data\$type <- 'train_error'

test_data <- data.frame(test_error_all[i,])
test_data\$num <- 1:35
names(test_data) <- c('error','num')
test_data\$type <- 'test_error'

train_all <- data.frame(train_error)
train_all\$num <- 1:35
names(train_all) <- c('error','num')
train_all\$type <- 'average(train_error)'

test_all <- data.frame(test_error)
test_all\$num <- 1:35
names(test_all) <- c('error','num')
test_all\$type <- 'average(test_error)'

g1 <- g1  + geom_line(data = train_data,aes(x=num,y=error),lwd = 1,colour = 'lightblue') +
geom_line(data = test_data,aes(x=num,y=error),lwd = 1,colour = 'lightpink') +
geom_line(data = train_all,aes(x=num,y=error),lwd = 2,colour = 'blue') +
geom_line(data = test_all,aes(x=num,y=error),lwd = 2,colour = 'red')

print(g1)
}
```

```for (i in 1:100){
plot(1:pnum,train_error_all[i,],xlab = '',ylab = '',xlim = c(0,pnum),ylim = c(0,0.6),
type = 'l',col = 'lightblue')
par(new = T)
plot(1:pnum,test_error_all[i,],xlab = '',ylab = '',xlim = c(0,pnum),ylim = c(0,0.6),
type = 'l',col = 'lightpink')

par(new = T)
}

plot(ld\$df,train_error,xlab = '',ylab = '',xlim = c(0,pnum),ylim = c(0,0.6),type = 'l',col = 'blue',lwd = 2)
par(new = T)
plot(ld\$df,test_error,xlab = 'Model Complexity (df)',ylab = 'Prediction Error',xlim = c(0,pnum),ylim = c(0,0.6),
type = 'l',col = 'red',lwd = 2)
box()
```

1. 虽然之前提到了方差-偏差分解，但模拟过程中其实并没有用到，计算的是总的误差，只是为了分析方便，下一篇会通过方差偏差分解来更细致分析误差。

2.之前提到的方差-偏差分解并不一定成立，只有在用均方误差度量模型误差时才成立，如果使用0-1误差等其他方法，就不再成立。

1. Ruppert D. The Elements of Statistical Learning: Data Mining, Inference, and Prediction[J]. Journal of the Royal Statistical Society, 2010, 99(466):567-567.

2. 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.

0 条评论

• ### 研报复制（三）：基于相对强弱指标的大小盘轮动

A股市场上存在着明显的大小盘轮动的现象，一段时间大盘表现强势，一段时间小盘表现强势，所谓二八轮动。这种现象提供了构建大小盘轮动策略的可能，目前常见的两种构建大小...

• ### 研报复制（二）：《基于阻力支撑相对强度（RSRS）的市场择时》

本文是对光大证券研究报告《基于阻力支撑相对强度（RSRS）的市场择时》前四种择时方法的复现。

• ### VaR系列（三）：DCC模型估计组合VaR

需要说明的一点是，如果我们假设所有的单个资产收益率都服从正态分布，资产组合的收益率是单个资产收益率的加权和，也服从正态分布，这种情况下，计算VaR只需要对组合的...

• ### vue前端异常监控sentry实践

但是onerror事件无法捕获到网络异常的错误(资源加载失败、图片显示异常等)，例如img标签下图片url 404 网络请求异常的时候，onerror无法捕获到...

• ### vue前端异常监控sentry实践

但是onerror事件无法捕获到网络异常的错误(资源加载失败、图片显示异常等)，例如img标签下图片url 404 网络请求异常的时候，onerror无法捕获到...

• ### css写作建议和性能优化小结

还有几天就到国庆中秋了，快要放假了，先祝大家节日快乐！之前写过js的写作建议和技巧，那么今天就来聊聊css吧！说到css，每一个网页都离不开css，但是对于cs...

• ### 如何搭建前端异常监控系统

是指用户在使用应用时，无法得到预期的结果。不同的异常带来的后果程度不同，轻则引起用户使用不悦，重则导致产品无法使用，从而使用户丧失对产品的认可。

• ### 记一次代码审计到申请CVE到过程

这篇文章主要是分享一下我随手提交的一个PHP低质量cve，之所以想写一下的原因是因为这段日子在我渗透技术库群中有一个朋友说到自己双非一本，但是正式工在等保横行的...