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