首页 > 编程语言 >R语言非参数方法:使用核方法和K-NN(k近邻算法)分类预测心脏病数据|附代码数据

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

时间:2023-10-30 23:56:26浏览次数:42  
标签:函数 NN 近邻 预测 估计 方法 我们 mean

原文链接: 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,我们得到以下代码

   
 
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近邻。


最受欢迎的见解

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

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

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

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

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

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

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

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

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

标签:函数,NN,近邻,预测,估计,方法,我们,mean
From: https://www.cnblogs.com/tecdat/p/17799253.html

相关文章

  • Annual Report on Fall Semester in 2023
    TodoListDecidethemilestonesinthisterm.Makeamajorpiplineofthistermaccompaniedwithtimeline.PlotagraphonpiplineofmilestonesbasedonthesubjectofDataVisualization.InformalPointsOctober12,2023:ChangedthesurnametoTar......
  • 快速编译QCMAP方法
    快速编译QCMAP方法:step1:cd/fibocom/huangguanyuan/sa522/sa525m_le/SA525M_apps/apps_proc/pokystep2:DISTRO=qti-distro-tele-debugMACHINE=sa525msourceqti-conf/set_bb_env.shstep3:bitbakesystemd|tee-abuild_systemd_log.txtbitbakedata|tee-ab......
  • AtCoder Beginner Contest 321(ABC321)
    A.321-likeChecker直接模拟。CodeB.Cutoff直接暴力枚举\([0\sim100]\),每次把第\(n\)个数当作当前枚举的\(i\),然后看看条件是否满足。CodeC.321-likeSearcherDescription给你一个\(K\),求出\([1\simK]\)区间内有多少个321-likeNumber。321-likeNumber的......
  • Solution to OpenSSL Connection Problems With Github
    ProblemsUploadingFileswithGitSometimeswecanusegittooltosuccessfullyuploadprojectstoGithub,butinothertimeespeciallyafteraperiodofconfiguration,weoftenmeetthefollowingerror:OpenSSLSSL_read:Connectionwasreset,error10054......
  • Java基础 反射获取成员方法
     代码示例:publicstaticvoidmain(String[]args)throwsException{//获取class字节码文件对象Classclazz=Class.forName("pojo.Student");//获取所有的方法(getMethods()还能连着父类的所有的公共方法一起获得,但getDeclaredMethods()不能获取父类里面的方法......
  • 重要的函数及方法
    (个人解题方法,可能有更高效的)输入方法input():都是以字符串的形式输入1、单行单个数据输入a=eval(input())#一般我习惯使用input()搭配eval()使用,也可直接将eval换成已经知道要转化类型的类型名#eg:a=int(input())补:eval()用法:将以字符串输入的格式转化为原本数据......
  • Java基础之方法
    方法前言1.程序开始执行的时候先从main方法开始2.Java语言中所有的方法体的代码都要遵守从上到下执行3.mian方法程序会自动调用,而main以外的方法需要程序员自己调用。4.main以外的方法只有被调用的时候才会执行什么是方法?为什么使用方法?方法是一个可以重复使用的代码段。而......
  • # yyds干货盘点 #Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。原始数据如下所示:二、实现过程这里【猫药师Kelly】给了一个代码和思路,如下所示:顺利地解决了粉丝的问题。下一篇文章,我们一起来看看另外一种方法。三、总结大家好,......
  • 怎么去除图片水印文字?这3个方法快来收藏
    图片怎么去除水印文字?现在嘛,图片已经成了我们生活和工作里必不可少的一部分,可是有时候看图的时候,总会碰到一些带水印的图片,这些水印总是搞得图片看起来不那么爽,所以很多人都想知道图片怎么去除水印文字,这样就能更好地用这些图片了,今天我就来跟你们说说几种常用的去水印方法,希望对你......
  • 这三个方法快学起来照片一键去文字水印
    照片去文字水印怎么弄?你有没有遇到过这样的烦恼呢?我经常在网上找一些好看的照片来做头像或者壁纸,但是总是遇到一些带水印或者不想要的文字的照片,影响了整体的美观度让人很头疼,每次重新找又得花费不少时间和精力,不过别担心现在有一些好用的去水印工具可以帮助我们轻松解决这个问题,接......