• 拓端数据tecdat|R语言非参数方法:使用核方法和K-NN(k近邻算法)分类预测心脏病数据


    原文链接: http://tecdat.cn/?p=22181 

    原文出处:拓端数据部落公众号

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

    非参数方法

    用于函数估计的非参数方法大致上有三种:核方法、局部多项式方法、样条方法。
    非参的函数估计的优点在于稳健,对模型没有什么特定的假设,只是认为函数光滑,避免了模型选择带来的风险;但是,表达式复杂,难以解释,计算量大是非参的一个很大的毛病。所以说使用非参有风险,选择需谨慎。
    非参的想法很简单:函数在观测到的点取观测值的概率较大,用x附近的值通过加权平均的办法估计函数f(x)的值。

    核方法

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


    GM核估计形式为:

    式中

    数据

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

    1. 心脏指数
    2. 心搏量指数
    3. 舒张压
    4. 肺动脉压
    5. 心室压力
    6. 肺阻力
    7. 是否存活

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

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

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

    1.  
      Vectorize( mean_x(x,2))(u)
    2.  
       
    3.  
       
    4.  

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

    使用光滑函数

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

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

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

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

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

    高维应用

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

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

    我们得到以下预测

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

    K-NN(k近邻算法)

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

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

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

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

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

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

    1.  
       
    2.  
      for(i in 1:length(Y)) Y[i] = sort( 存活[k_closest(i,k)])[(k+1)/2]
    3.  
       
    4.  
       
    5.  

    我们也可以计算出最近邻居中黑点的比例。它实际上可以被解释为是黑色的概率,

    1.  
      for(i in 1:length(Y)) Y[i] = mean( 存活[k_closest(i,k)])
    2.  
       
    3.  
       
    4.  

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

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

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

    1.  
    2.  
       
    3.  
      w = rank(abs(心搏量指数-x),method ="random")
    4.  
      mean(存活[which(<=9)])}
    5.  
       
    6.  
       
    7.  

    不是很平滑,但我们的点也不是很多。
    如果我们在二维数据集上使用这种方法,我们就会得到以下的结果。

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

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


    最受欢迎的见解

    1.从决策树模型看员工为什么离职

    2.R语言基于树的方法:决策树,随机森林

    3.python中使用scikit-learn和pandas决策树

    4.机器学习:在SAS中运行随机森林数据分析报告

    5.R语言用随机森林和文本挖掘提高航空公司客户满意度

    6.机器学习助推快时尚精准销售时间序列

    7.用机器学习识别不断变化的股市状况——隐马尔可夫模型的应用

    8.python机器学习:推荐系统实现(以矩阵分解来协同过滤)

    9.python中用pytorch机器学习分类预测银行客户流失

    ▍关注我们 【大数据部落】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。 ▍咨询链接:http://y0.cn/teradat ▍联系邮箱:3025393450@qq.com
  • 相关阅读:
    基于flash的web视频对讲直播测试
    终于放弃Windows下丑陋的cmd
    直播推流兼容性问题追踪
    32位和64位dll判断
    H264编码参数的一些小细节
    cmake编译win下64位obs
    The certificate used to sign "XXX" has either expired or has been revoked
    记录一次Android交叉编译ffmpeg排查错误
    SDK "iphoneos" cannot be located
    av_interleaved_write_frame 网络不好的情况下返回较慢
  • 原文地址:https://www.cnblogs.com/tecdat/p/14819740.html
Copyright © 2020-2023  润新知