ESL-chapter6 Kernel Smoother

第一节,一维的核光滑。首先,来画图6.1,按照图6.1 的要求生成数据。

x <- seq(0,1,by =.01);   y <- sin(4*x)+rnorm(length(x),0,1/3)

然后,计算最近邻的点及Y的平均值。
#computing the mean value of y 
NNkernel <- function(x,y,k,x0)
{
   d <- abs(x-x0)
   a <- cbind(d,y)
   a <- a[order(a[,1]),]
   return(mean(a[1:k,2]))
}
#然后把所有的点都算出来。
y.NNkernel <- c()
for(i in x)
    {
        temp <- NNkernel(x,y,30,i)
      
        y.NNkernel <- c(y.NNkernel,temp)
    }
#接下来,计算核函数的权值及相应的平均值。
 Epanechnikov.Kernel <- function(x,y,x0,lamda)
    {
        d <- abs(x-x0)
        DT <- 0.75*(1-((x[d<lamda]-x0)/lamda)^2)
        return( DT%*%y[d<lamda]/sum(DT))

    }

#计算所有样本点。

y.Epanechnikov.Kernel <- c()
for(i in x)
    {
        temp <- Epanechnikov.Kernel(x,y,i,.2)
      
        y.Epanechnikov.Kernel <- c(y.Epanechnikov.Kernel,temp)
    }

最后,画出图

plot(x,y)
lines(x,sin(4*x),col="blue")
lines(x,y.NNkernel,col="green")
lines(x,y.Epanechnikov.Kernel,col="red")

从图中,我们可以看出最近邻(绿线)比较粗糙,核加权(红线)较为光滑。但是最近邻在边界上的点是一条直线,因为最近邻点都差不多。不知道书上画的为什么是有区别的。

我想应该是在边界处不再采用30作为最近邻的个数了。

从图中还可以看出,在边界区域,红色的拟合曲线偏上,这是由于核函数的不对称引起的(实际上是因为边界点邻域两边的样本数不一致)。因此,引出了局部线性回归和多项式回归两种技术。

下面来看图6.3右图是怎么画出来的。(就是线性回归技术-一阶矫正),按照公式6.8生成曲线。

B <- cbind(rep(1,length(x)),x)
Epanechnikov.Kernel.Weight <- function(x,y,x0,lamda)
    {
        DT <- rep(0,length(x))
        d <- abs(x-x0)
        DT[d<lamda] <- 0.75*(1-((x[d<lamda]-x0)/lamda)^2)
        return(diag(DT))
    }
local.linear <- function(x,y,x0,B,lamda)
    {
        W.x0 <- Epanechnikov.Kernel.Weight(x,y,x0,lamda)
        f <- t(c(1,x0))%*%solve(t(B)%*%W.x0%*%B)%*%t(B)%*%W.x0%*%y
        return(f)
    }
y.local.linear <- c()
for(i in x)
    {
        temp <- local.linear(x,y,i,B,0.2)
      
        y.local.linear <- c(y.local.linear,temp)
    }
plot(x,y)
lines(x,sin(4*x),col="blue")
lines(x,y.local.linear,col="green")
lines(x,y.Epanechnikov.Kernel,col="red")

从图中可以看出,局部线性回归(绿色)确实矫正了拟合曲线(红色)。


画出等价核之后的图,相当于书上的图 6.4. 我的代码把li(x0)scale了10倍。书上的应该更高。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值