第一节,一维的核光滑。首先,来画图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倍。书上的应该更高。