搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  knnRegress_基于最近邻抽样回归模型的水文水资源预测.pdf
资料下载链接地址: https://bbs.pinggu.org/a-1859832.html
附件大小:
252.38 KB   举报本内容
1,核回归(Kernal Regression),首先定义诸如高斯核函数,Epanechnikov核函数,再基于最优宽窗h,并基于Nadaraya-Waston核估计得到结果,代码如下:
1.1,高斯核函数与Epane核函数
[hide]
  1. #Gaussian Kernal
  2. #高斯核
  3. kernalGaussian <- function(xData)
  4. {
  5. #得到相应的核函数

  6. if(ncol(xData)!=1)
  7. {
  8. stop('error input data')
  9. }

  10. stdX <- sd(xData)
  11. #高斯宽带的选择
  12. h <- 1.06*stdX*length(xData)^(-1/5)

  13. kernalX <- 1/(h*sqrt(2*pi)) * exp(-xData^2/(2*h^2))
  14. return(kernalX)

  15. }

  16. #Epanechnikov kernal
  17. kernalEpanechnikov <- function (xData)
  18. {
  19. if(ncol(xData)!=1)
  20. {
  21. stop('error input the data')
  22. }

  23. stdX <- sd(xData)

  24. h<-2.34*stdX*length(xData)^(-1/5)

  25. xPh<- abs(xData/h)
  26. xPh[xPh <=1] <-1
  27. xPh[xPh>1] <- 0

  28. kernalX <- 0.75/h*(1-(xData/h)^2)*xPh
  29. return(kernalX)

  30. }
复制代码

[/hide]

1.2 两个核函数的检测:
[hide]
  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))
复制代码

[/hide]

1.3 以下是著名的Nadaraya-Waston核估计
[hide]
  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. #最终返回针对y的核回归拟合的值
  11. nData<-nrow(xData)

  12. if(nData!=nrow(yData))
  13. {
  14. stop('error input the data')
  15. }

  16. if (!is.character(kernalName) || !length(intersect(c('Gaussian','Epanechnikov'),kernalName)) )
  17. {
  18. stop('error input the kernal name')
  19. }

  20. yRegress <- matrix(NaN , nrow = nData , ncol = 1)

  21. for (i in c(1:nData))
  22. {
  23. x <- xData[i]
  24. xXt <- matrix(x , nrow = nData, ncol = 1) - xData

  25. if (setequal(kernalName , 'Gaussian'))
  26. {
  27. khX <- kernalGaussian(xXt)
  28. } else if (setequal(kernalName , 'Epanechnikov'))
  29. {
  30. khX <- kernalEpanechnikov(xXt)
  31. }

  32. yRegress[i] <- sum(yData*khX)/sum(khX)

  33. }

  34. return(yRegress)


  35. }
  36. #核回归的检测
  37. x<- as.matrix(rnorm(100,mean = 0,sd = 0.03))
  38. y<- 0.5*x + as.matrix(rnorm(100,mean = 0,sd = 0.01))

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

  40. plot(c(1:100),y,col = 'white')
  41. lines(c(1:100),y,col = 'blue')
  42. lines(c(1:100),kernalRegress(x,y,'Gaussian'),col = 'red')
  43. lines(c(1:100),kernalRegress(x,y,'Epanechnikov'),col = 'green')
复制代码

[/hide]

2,NNBR(最近邻回归)
一篇基本思路的Paper:
2.1,单变量NBRR源码如下:
[hide]
  1. #单变量的回归
  2. #NNBRknn近邻回归与预测


  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. if (ncol(xData)!= 1)
  16. {
  17. stop('error input data')
  18. }

  19. if ((nrow(xData) - lags)<1)
  20. {
  21. stop('error input the Data')
  22. }

  23. #当前的数据集合
  24. currentData <- xData

  25. k <- ceiling(sqrt(nrow(xData) - lags))

  26. #先计算所有的特征向量
  27. currentVector <- xData[c(( nrow(xData)-lags+1):(nrow(xData)))]
  28. currentVector <- t(as.matrix(currentVector))

  29. Vectors<-NULL
  30. xOut<-NULL
  31. #获取其他的特征向量
  32. i<-1
  33. while(TRUE)
  34. {
  35. if ((i+lags - 1) == (nrow(xData)))
  36. {
  37. break
  38. }
  39. vectors<- t(as.matrix(xData[(i):(i+lags - 1)]))

  40. xOut<-c(xOut,xData[i+lags])

  41. Vectors<-rbind(Vectors,vectors)

  42. i<-i+1
  43. }

  44. #再从中寻找距离最小的K个值
  45. nV <- nrow(Vectors)

  46. currData <- matrix(rep(currentVector , nV),nrow = nV,byrow = TRUE)
  47. Distance <- sqrt( apply((Vectors - currData)^2,1,sum) )
  48. #再计算距离的最小的前k个值
  49. #从大到小的几个下标
  50. Index <- order(Distance)
  51. Index <- Index[c(1:k)]

  52. xOut<-xOut[Index]
  53. DistanceOut <- Distance[Index]

  54. #对样本外的结果进行预测
  55. #权重的配置
  56. if (disType == 1)
  57. {
  58. xForecasting <- sum(DistanceOut/sum(DistanceOut)*xOut)
  59. } else
  60. {
  61. xForecasting <- sum((c(k:1)/k)/sum((c(k:1)/k))*xOut)
  62. }
  63. return(xForecasting)

  64. }
  65. data <- as.matrix(cumsum(matrix(rnorm(100),nrow = 100)))
  66. data
  67. nnbrRegress(data,8,1)
  68. nnbrRegress(data,8,2)
  69. #各种不同的滞后阶数
  70. nnbrRegress(data,10,1)
  71. nnbrRegress(data,10,2)
  72. #各种不同的滞后阶数
  73. nnbrRegress(data,15,1)
  74. nnbrRegress(data,15,2)
  75. #eof
复制代码
[/hide]
2.2,多变量NNBR源码如下:
[hide]
  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. if (ncol(xData)!=ncol(testData))
  12. {
  13. stop('error input data')
  14. }

  15. if (!is.matrix(xData) ||!is.matrix(yData) || !is.matrix(testData))
  16. {
  17. stop('error input data')
  18. }

  19. #取得特征向量的个数
  20. k<-ceiling(sqrt(nrow(xData)))

  21. yForecasting<-matrix(NaN , nrow = nrow(testData),ncol = 1)

  22. for (i in c(1:nrow(testData)))
  23. {
  24. x<-testData[i,]

  25. xDataRep <-rep(x,nrow(xData))
  26. xDataRep <- matrix(xDataRep,nrow = nrow(xData) , byrow = TRUE)
  27. #计算距离

  28. Distance <- sqrt(apply((xData - xDataRep)^2,1,sum))

  29. Index <- order(Distance)
  30. #选择前k个值
  31. Index<-Index[c(1:k)]
  32. ys<-(yData[Index])
  33. Weight<-(1/Distance)/sum(1/Distance)

  34. yForecasting[i] <-sum(ys*Weight)

  35. }
  36. return(yForecasting)

  37. }


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

  41. nnbrRegressMultivariate(xData , yData , testData)
复制代码
[/hide]


    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

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

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

GMT+8, 2025-12-24 12:17