原文链接:http:///?p=22181 本文考虑一下基于核方法进行分类预测。注意,在这里,我们不使用标准逻辑回归,它是参数模型。 非参数方法用于函数估计的非参数方法大致上有三种:核方法、局部多项式方法、样条方法。 核方法当加权的权重是某一函数的核,这种方法就是核方法,常见的有Nadaraya-Watson核估计与Gasser-Muller核估计方法,也就是很多教材里谈到的NW核估计与GM核估计,这里我们还是不谈核的选择,将一切的核估计都默认用Gauss核处理。 GM核估计形式为: 式中 数据使用心脏病数据,预测急诊病人的心肌梗死,包含变量: 心脏指数 dnorm(( 心搏量指数-x)/bw, mean=0,sd=1) 当然,我们可以改变带宽。 Vectorize( mean_x(x,2))(u) 我们观察到:带宽越小,我们得到的方差越大,偏差越小。“越大的方差”在这里意味着越大的可变性(因为邻域越小,计算平均值的点就越少,估计值也就越不稳定),以及“偏差越小”,即期望值应该在x点计算,所以邻域越小越好。 使用光滑函数用R函数来计算这个核回归。 smooth( 心搏量指数, 存活, ban = 2*exp(1) 我们可以复制之前的估计。然而,输出不是一个函数,而是两个向量序列。此外,正如我们所看到的,带宽与我们以前使用的带宽并不完全相同。 smooth(心搏量指数,存活,"normal",bandwidth = bk) 斜率为0.37,实际上是e^{-1}。 高维应用现在考虑我们的双变量数据集,并考虑一些单变量(高斯)核的乘积 w = dnorm((df$x1-x)/bw1, mean=0,sd=1)*
在这里,不同的颜色是概率。 K-NN(k近邻算法)另一种方法是考虑一个邻域,它不是用到点的距离来定义的,而是用我们得到的n观测值来定义k邻域(也就是k近邻算法)。 接下来,我们自己编写函数来实现K-NN(k近邻算法): 困难的是我们需要一个有效的距离。 如果每个分量的单位都非常不同,那么使用欧几里德距离将毫无意义。所以,我们考虑马氏距离 mahalanobis = function(x,y,Sinv){as.numeric(x-y)%*%Sinv%*%t(x-y)}
for(i in 1:length(Y)) Y[i] = sort( 存活[k_closest(i,k)])[(k+1)/2]
for(i in 1:length(Y)) Y[i] = mean( 存活[k_closest(i,k)])
k_ma(7),PROPORTION=k_mean(7)) 这里,我们得到了一个位于 x 的观测点的预测,但实际上,可以寻找任何 x的最近邻k。回到我们的单变量例子(得到一个图表),我们有 w = rank(abs(心搏量指数-x),method ="random") 不是很平滑,但我们的点也不是很多。 k = 6 这就是局部推理的思想,用kernel对 x的邻域进行推理,或者用k-NN近邻。 |
|