楼主: fantuanxiaot
38914 188

[R] [原创]基于R语言的核回归(Kernal Regression)与最近邻回归(NNBR)   [推广有奖]

Ψ▄┳一大卫卍卐席尔瓦

大师

8%

还不是VIP/贵宾

-

威望
7
论坛币
-234475 个
通用积分
124.1424
学术水平
3783 点
热心指数
3819 点
信用等级
3454 点
经验
150207 点
帖子
7546
精华
32
在线时间
1327 小时
注册时间
2013-2-3
最后登录
2022-2-24

初级学术勋章 初级热心勋章 中级热心勋章 中级学术勋章 初级信用勋章 中级信用勋章 高级热心勋章 高级学术勋章 特级学术勋章 特级热心勋章 高级信用勋章 特级信用勋章

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
1,核回归(Kernal Regression),首先定义诸如高斯核函数,Epanechnikov核函数,再基于最优宽窗h,并基于Nadaraya-Waston核估计得到结果,代码如下:
1.1,高斯核函数与Epane核函数

本帖隐藏的内容


  1. #  Gaussian Kernal
  2. #  高斯核
  3. kernalGaussian <- function(xData)
  4. {
  5.   #  得到相应的核函数
  6.   
  7.   if(ncol(xData)!=1)
  8.   {
  9.     stop('error input data')
  10.   }
  11.   
  12.   stdX <- sd(xData)
  13.   #  高斯宽带的选择
  14.   h <- 1.06*stdX*length(xData)^(-1/5)
  15.   
  16.   kernalX <- 1/(h*sqrt(2*pi)) * exp(-xData^2/(2*h^2))
  17.   return(kernalX)
  18.   
  19. }

  20. #  Epanechnikov kernal
  21. kernalEpanechnikov <- function (xData)
  22. {
  23.   if(ncol(xData)!=1)
  24.   {
  25.     stop('error input the data')
  26.   }
  27.   
  28.   stdX <- sd(xData)
  29.   
  30.   h<-2.34*stdX*length(xData)^(-1/5)
  31.   
  32.   xPh<- abs(xData/h)
  33.   xPh[xPh <=1] <-1
  34.   xPh[xPh>1] <- 0
  35.   
  36.   kernalX <- 0.75/h*(1-(xData/h)^2)*xPh
  37.   return(kernalX)
  38.   
  39. }
复制代码




1.2 两个核函数的检测:

本帖隐藏的内容


  1. #  两个核函数的检测
  2. testData1 <- as.matrix(seq(-10,10,by = 0.5))
  3. testData2 <- as.matrix(seq(-10,10,length = 100))

  4. kernalGaussian(testData1)

  5. kernalEpanechnikov(testData2)

  6. #  高斯核的数据的作图
  7. plot(kernalGaussian(testData2))

  8. #  Epanechnikov核函数的作图
  9. plot(kernalEpanechnikov(testData2))
复制代码




1.3 以下是著名的Nadaraya-Waston核估计

本帖隐藏的内容


  1. #  #########################################################
  2. #  以下是著名的Nadaraya-Waston核估计
  3. #  by fantuanxiaot
  4. kernalRegress <- function(xData , yData , kernalName)
  5. {
  6.   if(!is.matrix(xData)||!is.matrix(yData))
  7.   {
  8.     stop('error input the empirical data')
  9.   }
  10.   
  11.   #  最终返回针对y的核回归拟合的值
  12.   nData<-nrow(xData)
  13.   
  14.   if(nData!=nrow(yData))
  15.   {
  16.     stop('error input the data')
  17.   }

  18.   if (!is.character(kernalName) || !length(intersect(c('Gaussian','Epanechnikov'),kernalName)) )
  19.   {
  20.     stop('error input the kernal name')
  21.   }
  22.   
  23.   yRegress <- matrix(NaN , nrow = nData , ncol = 1)
  24.   
  25.   for (i in c(1:nData))
  26.   {
  27.     x <- xData[i]
  28.     xXt <- matrix(x , nrow = nData, ncol = 1) - xData
  29.    
  30.     if (setequal(kernalName , 'Gaussian'))
  31.     {
  32.       khX <- kernalGaussian(xXt)
  33.     } else if (setequal(kernalName , 'Epanechnikov'))
  34.     {
  35.       khX <- kernalEpanechnikov(xXt)
  36.     }
  37.    
  38.     yRegress[i] <- sum(yData*khX)/sum(khX)
  39.    
  40.   }
  41.   
  42.   return(yRegress)
  43.   
  44.   
  45. }
  46. #  核回归的检测
  47. x<- as.matrix(rnorm(100,mean = 0,sd = 0.03))
  48. y<- 0.5*x + as.matrix(rnorm(100,mean = 0,sd = 0.01))

  49. cbind(y,kernalRegress(x,y,'Gaussian') , kernalRegress(x,y,'Epanechnikov'))

  50. plot(c(1:100),y,col = 'white')
  51. lines(c(1:100),y,col = 'blue')
  52. lines(c(1:100),kernalRegress(x,y,'Gaussian'),col = 'red')
  53. lines(c(1:100),kernalRegress(x,y,'Epanechnikov'),col = 'green')
复制代码




2,NNBR(最近邻回归)
一篇基本思路的Paper: knnRegress_基于最近邻抽样回归模型的水文水资源预测.pdf (252.38 KB)
2.1,单变量NBRR源码如下:

本帖隐藏的内容


  1. #  单变量的回归
  2. #  NNBR  knn近邻回归与预测


  3. #  这里是基于单变量的时间序列
  4. setwd('D:/MyDriversMatlab/Mfiles13')
  5. rm(list=ls())
  6. nnbrRegress<-function (xData , lags , disType)
  7. {
  8.   #  lags是滞后的阶数P
  9.   #  outNum是样本外预测的个数
  10.   #  disType是计算距离的类别
  11.   if (!is.matrix(xData))
  12.   {
  13.     stop('error input the Current Data')
  14.   }
  15.   
  16.   
  17.   if (ncol(xData)!= 1)
  18.   {
  19.     stop('error input data')
  20.   }
  21.   
  22.   if ((nrow(xData) - lags)<1)
  23.   {
  24.     stop('error input the Data')
  25.   }
  26.   
  27.   #  当前的数据集合
  28.   currentData <- xData
  29.   
  30.   k <- ceiling(sqrt(nrow(xData) - lags))
  31.   
  32.   #  先计算所有的特征向量
  33.   currentVector <- xData[c(( nrow(xData)-lags+1  ):(nrow(xData)))]
  34.   currentVector <- t(as.matrix(currentVector))
  35.   
  36.   Vectors<-NULL
  37.   xOut<-NULL
  38.   #  获取其他的特征向量
  39.   i<-1
  40.   while(TRUE)
  41.   {
  42.     if ((i+lags - 1) == (nrow(xData)))
  43.     {
  44.       break
  45.     }
  46.     vectors<- t(as.matrix(xData[(i):(i+lags - 1)]))
  47.    
  48.     xOut<-c(xOut,xData[i+lags])
  49.    
  50.     Vectors<-rbind(Vectors,vectors)
  51.    
  52.     i<-i+1
  53.   }
  54.   
  55.   #  再从中寻找距离最小的K个值
  56.   nV <- nrow(Vectors)
  57.   
  58.   currData <- matrix(rep(currentVector , nV),nrow = nV,byrow = TRUE)
  59.   Distance <- sqrt( apply((Vectors - currData)^2,1,sum) )
  60.   #  再计算距离的最小的前k个值
  61.   #  从大到小的几个下标
  62.   Index <- order(Distance)
  63.   Index <- Index[c(1:k)]
  64.   
  65.   xOut<-xOut[Index]
  66.   DistanceOut <- Distance[Index]
  67.   
  68.   #  对样本外的结果进行预测
  69.   #  权重的配置
  70.   if (disType == 1)
  71.   {
  72.     xForecasting <- sum(DistanceOut/sum(DistanceOut)*xOut)
  73.   } else
  74.   {
  75.     xForecasting <- sum((c(k:1)/k)/sum((c(k:1)/k))*xOut)
  76.   }
  77.   return(xForecasting)
  78.   
  79. }
  80. data <- as.matrix(cumsum(matrix(rnorm(100),nrow = 100)))
  81. data
  82. nnbrRegress(data,8,1)
  83. nnbrRegress(data,8,2)
  84. #  各种不同的滞后阶数
  85. nnbrRegress(data,10,1)
  86. nnbrRegress(data,10,2)
  87. #  各种不同的滞后阶数
  88. nnbrRegress(data,15,1)
  89. nnbrRegress(data,15,2)
  90. #  eof
复制代码


2.2,多变量NNBR源码如下:

本帖隐藏的内容


  1. #  D:\MyDriversMatlab\Mfiles13
  2. setwd('D:/MyDriversMatlab/Mfiles13')

  3. #  基于knn回归的最近邻算法
  4. rm(list=ls())
  5. nnbrRegressMultivariate<-function (xData , yData , testData)
  6. {
  7.   if(nrow(xData)!=nrow(yData))
  8.   {
  9.     stop('error input data')
  10.   }
  11.   
  12.   if (ncol(xData)!=ncol(testData))
  13.   {
  14.     stop('error input data')
  15.   }
  16.   
  17.   if (!is.matrix(xData) ||  !is.matrix(yData) || !is.matrix(testData))
  18.   {
  19.     stop('error input data')
  20.   }
  21.   
  22.   #  取得特征向量的个数
  23.   k<-ceiling(sqrt(nrow(xData)))
  24.   
  25.   yForecasting<-matrix(NaN , nrow = nrow(testData),ncol = 1)
  26.   
  27.   for (i in c(1:nrow(testData)))
  28.   {
  29.     x<-testData[i,]
  30.    
  31.     xDataRep <-rep(x,nrow(xData))
  32.     xDataRep <- matrix(xDataRep,nrow = nrow(xData) , byrow = TRUE)
  33.     #  计算距离
  34.    
  35.     Distance <- sqrt(apply((xData - xDataRep)^2,1,sum))
  36.    
  37.     Index <- order(Distance)
  38.     #  选择前k个值
  39.     Index<-Index[c(1:k)]
  40.     ys<-(yData[Index])
  41.     Weight<-(1/Distance)/sum(1/Distance)
  42.    
  43.     yForecasting[i] <-sum(ys*Weight)
  44.    
  45.   }
  46.   return(yForecasting)
  47.   
  48. }


  49. xData <- matrix(rnorm(100),ncol = 4)
  50. yData <- as.matrix(apply(xData,1,mean))
  51. testData <- matrix(rnorm(40),ncol = 4)

  52. nnbrRegressMultivariate(xData , yData , testData)
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:regression regressio regress nbr RES 高斯

回帖推荐

hou0922 发表于107楼  查看完整内容

楼主有没有关于用R做kernel regression的资料,最近刚开始学kernel,好多不懂,求指教

gxnnhgm66 发表于123楼  查看完整内容

已经转帖。再谢!

Crsky7 发表于11楼  查看完整内容

不喜欢用R
已有 13 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
rg11mfl + 4 + 4 精彩帖子
newfei188 + 1 精彩帖子
harvey_tei + 1 + 1 + 1 精彩帖子
kongqingbao280 + 60 对论坛有贡献
Nicolle + 100 + 100 + 1 + 1 + 1 精彩帖子
zbin7451f + 100 + 5 + 5 + 5 精彩帖子
sfhsky + 60 + 3 + 4 精彩帖子
yzz_young + 5 + 4 + 4 + 4 精彩帖子
niuniuyiwan + 60 + 60 + 5 + 5 + 5 精彩帖子
我的素质低 + 5 精彩帖子

总评分: 经验 + 580  论坛币 + 415  学术水平 + 38  热心指数 + 34  信用等级 + 34   查看全部评分

本帖被以下文库推荐

沙发
xddlovejiao1314 学生认证  发表于 2015-8-21 10:20:18 |只看作者 |坛友微信交流群

回帖奖励 +3

好贴,谢谢分享。
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
newfei188 + 1 精彩帖子
fantuanxiaot + 50 + 5 + 5 + 5 精彩帖子
niuniuyiwan + 30 + 5 精彩帖子

总评分: 经验 + 80  论坛币 + 5  学术水平 + 6  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

藤椅
niuniuyiwan 在职认证  发表于 2015-8-21 10:21:20 |只看作者 |坛友微信交流群

回帖奖励 +3

感谢分享,感谢楼主,发帖良苦,令人钦佩。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
fantuanxiaot + 50 + 5 + 5 + 5 精彩帖子
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 80  论坛币 + 3  学术水平 + 5  热心指数 + 6  信用等级 + 5   查看全部评分

使用道具

板凳
Jealy 在职认证  发表于 2015-8-21 10:39:02 |只看作者 |坛友微信交流群

回帖奖励 +3

谢谢分享,很有用的帖子
已有 1 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 30  论坛币 + 3  热心指数 + 1   查看全部评分

使用道具

报纸
kp2010forever 发表于 2015-8-21 10:44:57 |只看作者 |坛友微信交流群

回帖奖励 +3

谢谢楼主分享
已有 1 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 30  论坛币 + 3  热心指数 + 1   查看全部评分

使用道具

地板
hoho936 发表于 2015-8-21 10:45:40 |只看作者 |坛友微信交流群

回帖奖励 +3

不错啊,回复一下看看具体内容
已有 1 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 30  论坛币 + 3  热心指数 + 1   查看全部评分

使用道具

7
hoho936 发表于 2015-8-21 10:55:20 |只看作者 |坛友微信交流群

回帖奖励 +3

代码不错,收藏了
已有 1 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 30  论坛币 + 3  热心指数 + 1   查看全部评分

使用道具

8
tmdxyz 发表于 2015-8-21 11:04:11 |只看作者 |坛友微信交流群

回帖奖励 +3

下来学习一下
已有 1 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 30  论坛币 + 3  热心指数 + 1   查看全部评分

使用道具

9
hoho936 发表于 2015-8-21 11:11:21 |只看作者 |坛友微信交流群

回帖奖励 +3

水一个,拿币走人
已有 1 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 30  论坛币 + 3  热心指数 + 1   查看全部评分

使用道具

10
lipj 在职认证  发表于 2015-8-21 11:15:59 |只看作者 |坛友微信交流群

回帖奖励 +3

已有 1 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 30 + 3 + 1 鼓励积极发帖讨论

总评分: 经验 + 30  论坛币 + 3  热心指数 + 1   查看全部评分

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 14:08