Kernal Density Estimation

在给定一些数据的情况下,估计未知概率密度函数的方法 (博主说,这玩意有点像 histogram)

主要思路

确定一个 kernal function,把核函数中心放在数据点上,求和,归一化

是一个 kernal function, 距离 因为对称,代入就是该有的密度函数值,然后求和

Kernal Function

  • 非负的
  • 对称的
  • 递减的 (要求远离这个数据点的概率低)

选择一个完美的“核”并不重要,因为当数据点很多的时候,不管选什么核,结果都会趋同的。相反的,带宽很重要

Bandwidth

注意多了一个 ,这个就是带宽。但是课本上选择的是改变方差,其实效果都差不多,都表现在核的宽度,也就是“容错率”?实际上前面也说到了,不同的核会趋向同一个答案的

那么如何选择带宽决定了你拟合得有多好。好在有不少自动选择带宽的方法

实操

课本上的示例代码挺精巧的

# ...
for (i in 1:6)  
{  
  l[,i] = dnorm(xgrid,x[i],.4)/6  
  l2[,i] = dnorm(xgrid,x[i],.2)/6  
  l3[,i] = dnorm(xgrid,x[i],.8)/6  
}
# ...
# l[, 1] + l[, 2] + l[, 3] + l[, 4] + l[, 5] + l[, 6]
kde = l %*% matrix(1,6,1)  # 太精妙了,矩阵乘法用于求和  
kde2 = l2 %*% matrix(1,6,1)  
kde3 = l3 %*% matrix(1,6,1)
# ...

本来对于矩阵内的数据需要按行求和放在第一个,成为一个“向量”

R 语言提供了一个 density() 函数,就是用来做核密度估计的。其中 adjust 参数用来控制 bandwidth