R语言非参数方法:使用核回归平滑估计和K-NN(K近邻算法)分类预测心脏病数据

简介: R语言非参数方法:使用核回归平滑估计和K-NN(K近邻算法)分类预测心脏病数据

本文考虑一下基于核方法进行分类预测。注意,在这里,我们不使用标准逻辑回归,它是参数模型。

非参数方法

用于函数估计的非参数方法大致上有三种:核方法、局部多项式方法、样条方法。

非参的函数估计的优点在于稳健,对模型没有什么特定的假设,只是认为函数光滑,避免了模型选择带来的风险;但是,表达式复杂,难以解释,计算量大是非参的一个很大的毛病。所以说使用非参有风险,选择需谨慎。

非参的想法很简单:函数在观测到的点取观测值的概率较大,用x附近的值通过加权平均的办法估计函数f(x)的值。

核方法

当加权的权重是某一函数的核,这种方法就是核方法,常见的有Nadaraya-Watson核估计与Gasser-Muller核估计方法,也就是很多教材里谈到的NW核估计与GM核估计,这里我们还是不谈核的选择,将一切的核估计都默认用Gauss核处理。

NW核估计形式为:

GM核估计形式为:

式中

数据

使用心脏病数据,预测急诊病人的心肌梗死,包含变量:

心脏指数

心搏量指数

舒张压

肺动脉压

心室压力

肺阻力

是否存活

既然我们知道核估计是什么,我们假设k是N(0,1)分布的密度。在x点,使用带宽h,我们得到以下代码

dnorm(( 心搏量指数-x)/bw, mean=0,sd=1)
weighted.mean( 存活,w)}
plot(u,v,ylim=0:1,

当然,我们可以改变带宽。

Vectorize( mean_x(x,2))(u)


我们观察到:带宽越小,我们得到的方差越大,偏差越小。“越大的方差”在这里意味着越大的可变性(因为邻域越小,计算平均值的点就越少,估计值也就越不稳定),以及“偏差越小”,即期望值应该在x点计算,所以邻域越小越好。

使用光滑函数

用R函数来计算这个核回归。

smooth( 心搏量指数, 存活, ban  = 2*exp(1)

我们可以复制之前的估计。然而,输出不是一个函数,而是两个向量序列。此外,正如我们所看到的,带宽与我们以前使用的带宽并不完全相同。

smooth(心搏量指数,存活,"normal",bandwidth = bk)
optim(bk,f)$par}
x=seq(1,10,by=.1)
plot(x,y)
abline(0,exp(-1),col="red")


斜率为0.37,实际上是e^{-1}。

高维应用

现在考虑我们的双变量数据集,并考虑一些单变量(高斯)核的乘积


w = dnorm((df$x1-x)/bw1, mean=0,sd=1)*
      dnorm((df$x2-y)/bw2, mean=0,sd=1)
  w.mean(df$y=="1",w)
contour(u,u,v,levels = .5,add=TRUE)

我们得到以下预测

在这里,不同的颜色是概率。

K-NN(k近邻算法)

另一种方法是考虑一个邻域,它不是用到点的距离来定义的,而是用我们得到的n观测值来定义k邻域(也就是k近邻算法)。

接下来,我们自己编写函数来实现K-NN(k近邻算法):

困难的是我们需要一个有效的距离。

如果每个分量的单位都非常不同,那么使用欧几里德距离将毫无意义。所以,我们考虑马氏距离

mahalanobis = function(x,y,Sinv){as.numeric(x-y)%*%Sinv%*%t(x-y)}
mahalanobis(my[i,1:7],my[j,1:7])


这里我们有一个函数来寻找k最近的邻居观察样本。然后可以做两件事来得到一个预测。我们的目标是预测一个类,所以我们可以考虑使用一个多数规则:对yi的预测与大多数邻居样本的预测是一样的。

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)])

我们可以在数据集上看到观察结果,基于多数原则的预测,以及死亡样本在7个最近的邻居中的比例

k_ma(7),PROPORTION=k_mean(7))

这里,我们得到了一个位于 x 的观测点的预测,但实际上,可以寻找任何 x的最近邻k。回到我们的单变量例子(得到一个图表),我们有


w = rank(abs(心搏量指数-x),method ="random")
  mean(存活[which(<=9)])}

不是很平滑,但我们的点也不是很多。

如果我们在二维数据集上使用这种方法,我们就会得到以下的结果。

k = 6
   dist = function(j)  mahalanobis(c(x,y))
  vect = Vectorize( dist)(1:nrow(df)) 
  idx  = which(rank(vect<=k)
 
contour(u,u,v,levels = .5,add=TRUE)

这就是局部推理的思想,用kernel对 x的邻域进行推理,或者用k-NN近邻。

相关文章
|
2月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
132 6
|
2月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
334 0
|
3月前
|
机器学习/深度学习 数据采集 传感器
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
316 0
|
1月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
128 0
|
1月前
|
机器学习/深度学习 算法 物联网
基于遗传方法的动态多目标优化算法
基于遗传方法的动态多目标优化算法
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1154 6
|
7月前
|
机器学习/深度学习 存储 算法
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
本文系统讲解从基本强化学习方法到高级技术(如PPO、A3C、PlaNet等)的实现原理与编码过程,旨在通过理论结合代码的方式,构建对强化学习算法的全面理解。
1941 10
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
236 3
|
10月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
1871 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
存储 算法 安全
SnowflakeIdGenerator-雪花算法id生成方法
SnowflakeIdGenerator-雪花算法id生成方法
413 1

热门文章

最新文章