ESL读书笔记2b:bias-variance tradeoff之 knn在k=1情况下受目标函数影响的bias和variance
来源:互联网 发布:虫虫钢琴软件 编辑:程序博客网 时间:2024/05/20 02:51
本文为Element of Statistical Learning (ESL, https://web.stanford.edu/~hastie/ElemStatLearn/)的读书笔记。文中并不全是对原书的总结整理,很多内容是基于原书,笔者自己的演绎,不具有权威性,欢迎指教。
第二章框架请看:ESL读书笔记2a:监督学习框架总览(未完待续)
此部分主要讨论knn(k nearest neighbor, k近邻)在k=1情况下,bias, variance和error(MSE)随输入维度p的变化。
1. bias-variance拆分
首先对误差平方和(mean squared error)进行著名的bias-variance拆分如下:
其中
2. 最近邻随维度增加与原点距离的变化趋势
在分情况讨论之前,还需要声明一个结论:随着p增大,最近邻离原点越来越远。使用中值近似整体趋势,有如下结论:最近邻与原点距离的中值为(具体证明见ESL作业笔记2.3:均匀分布情况下最近邻距离的中值):
书中还用一个一维到二维的例子说明:
黄色区域为只有X1一维情况下,最近邻到原点的距离;蓝色区域为二维情况下,最近邻到原点的距离。尽管在二维情况下黄色区域边缘的点距离原点很远,但投影到X1轴之后却很近。
对笔者来说,最直观的说法就是,维度增加,样本数不变,样本密度指数性减少,最近邻在原点附近的概率自然小了。
3. bias-variance的分情况讨论
既然是bias-variance tradeoff,这个名词就蕴含了几个假设:bias-variance常常难以同趋势变化,存在bias/variance主导误差的情况,tradeoff本身就是指在两者之间找一个平衡点。
这里举了两个例子,分别是bias和variance主导误差(MSE)的情况。
两个例子均满足条件:Suppose we have 1000 training examples
3.1. 情况一:bias主导
函数以及数据集、算法的介绍详见图下注释。简单说,函数曲线如左上图所示;随输入维度上升,最近邻距离上升,如右上和左下图所示。如右下图所示,误差(MSE)随维度上升而上升,受bias主导。
理解:
bias为预测输出的期望与目标值之间的差距,随着维度上升,最近邻距离增加,如函数曲线图所示,距离增加导致预测输出与目标输出越来越远,bias越来越大。
variance为实际预测输出与期望预测输出之间的方差,因为函数值是距离的函数,函数值的方差可以近似看做距离差异和相应位置函数值导数的乘积,而函数在距离很远的时候导数很小,所以乘起来得到的variance在维度数多的情况下很小。
3.2. 情况二:variance主导
与上例不同的是,这次函数值只受一维输入影响,其余维度输入的变化与函数值无关。如上图所示,误差的变化受variance主导。
理解:
这里笔者曾经走进一个误区,认为点投影到x轴上到原点距离的概率不变,为均匀分布,那么最近邻投影到x轴上到原点距离的概率分布也不变。这是受了均匀分布字面意思的误导,均匀分布指的是单位体积内样本点个数相同,对于1维的情况是基于距离均匀分布计算的最近邻分布;对于2维的情况,在以原点为圆心的同心圆的边上的点成为最近邻的概率相同,而考虑圆上单位长度边投影到x轴上的长度是不等的,所以最近邻投影到x轴点到原点的距离并不是x轴的均匀分布。进一步,该分布应该是中间低两边高的概率分布,而且随维度增加逐渐向四周扩散。
variance同样随p增加而增加,但增长趋势明显强于bias。考虑1维情况下,
4. 代码验证
为了更好的理解情况二,写了几段MATLAB代码,进行分析。
4.1. 最近邻代码
生成N个样本,返回最近邻。
function x=nn1(N,p)%randomly initialize N samples with dimension equal to p%and return the nearest neibor X = random('unif',-1,1,[N,p]);%size(X)dist = diag(X*X');min_dist = min(dist);for i=1:N if dist(i) == min_dist index = i; endendx = X(index,:);end
4.2. 最近邻分布
画出最近邻的大概分布,样本数为N,输入维度p,重复epoch次,使用柱状图近似分布。
function bar_x1(N,p,epoch)%plot the distribution of x1 with sample number N, dimension p, and epoch%number epoch.dist = zeros(epoch,1);for i = 1:epoch nn = nn1(N,p); dist(i) = nn(1);endhistogram(dist);
在p=1情况下,分布为:
p=2的分布为:
p=10的分布为:
其中横坐标为
4.3. 计算bias和variance
计算样本数为N,输入维度为p的情况下,bias、variance、error以及最近邻距离的均值方差。使用1000个epoch的结果对相应值做近似。
function [bias,variance,error,dist_mean,dist_var] = cal(N,p,epoch)%calculate knn(k=1) for epoch times, with function f(X) = 1/2(X_1+1)^3%return the average prediction, prediction variance, average MSE error,%the mean and variance of the distance of nearest neighbor on dimension 1predict = zeros(epoch,1);dists = zeros(epoch,1);for i = 1:epoch nn = nn1(N,p); predict(i) = 0.5*(nn(1)+1)^3; dists(i) = nn(1);endbias = mean(predict) - 0.5;variance = var(predict);error = (predict - 0.5)'*(predict-0.5)/N;dist_mean = mean(dists);dist_var = var(dists);end
其中函数为
4.4. 观察bias、variance等随维度p的变化
function main(P)bias = zeros(P,1);variance = zeros(P,1);error = zeros(P,1);dist_mean = zeros(P,1);dist_var = zeros(P,1);for p = 1:P [bias(p),variance(p),error(p),dist_mean(p),dist_var(p)] = cal(1000,p,1000);endfig1 = figureb = plot(bias);hold onv = plot(variance);e = plot(error);legend([b,v,e],'bias','variance','error');fig2 = figuredv = plot(dist_var);hold ondm = plot(dist_mean);legend([dv,dm],'mean','variance')
其中输入P为最大测试维度,这里使用10。
得到结果如下:
可以看出variance主导误差变化,
- ESL读书笔记2b:bias-variance tradeoff之 knn在k=1情况下受目标函数影响的bias和variance
- Bias-Variance Tradeoff
- Bias Variance Tradeoff
- Bias and Variance Tradeoff
- Bias-Variance Tradeoff
- Bias Variance Tradeoff
- Bias-Variance Tradeoff【转载】
- Bias-Variance Tradeoff
- 偏见方差的权衡(Bias Variance Tradeoff)
- bias与variance的权衡(tradeoff)
- Understanding the Bias-Variance Tradeoff
- Understanding the Bias-Variance Tradeoff
- Understanding the Bias-Variance Tradeoff
- Bias 和 Variance的理解
- bias 和 variance 的推导
- bias和variance
- bias和variance
- 关于bias 和 variance
- 1006. 换个格式输出整数 (15)
- 百炼 3468:电池的寿命
- zookeeper注册配置与启动
- mybatis 分页参数 RowBounds
- 数据结构实验之链表二:逆序建立链表
- ESL读书笔记2b:bias-variance tradeoff之 knn在k=1情况下受目标函数影响的bias和variance
- 静态方法加synchronized和非动态方法加synchronized的区别
- python的三目
- python之numpy库学习常用函数(矩阵运算)
- 兵法三十六计第一计-瞒天过海。
- GDI位图实现
- java中获取二维数组的行数和列数
- unity渲染路径
- Jzoj1310 生日礼物