楼主: fantuanxiaot
6196 109

[R] [原创]基于R语言的概率神经网络(PNN)   [分享]

回帖奖励 30 个论坛币 回复本帖可获得 3 个论坛币奖励! 每人限 3 次(中奖概率 90%)

Ψ▄┳一大卫卍卐席尔瓦

大师

9%

还不是VIP/贵宾

-

威望
7
论坛币
-235029 个
通用积分
17.3435
学术水平
3780 点
热心指数
3816 点
信用等级
3451 点
经验
150468 点
帖子
7695
精华
32
在线时间
1324 小时
注册时间
2013-2-3
最后登录
2019-12-11

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

fantuanxiaot 发表于 2015-8-23 14:39:20 |显示全部楼层
一个较好的概率神经网络资源算法:

本帖隐藏的内容

pNN概率神经网络(基于C语言伪码和Matlab代码).pdf (503.36 KB)



1.1首先需要构造归一化函数:

本帖隐藏的内容

  1. #  function
  2. #  基于高斯核函数
  3. #  首先是矩阵的归于化的函数
  4. #  模仿matlab的归一化mapminmax函数
  5. #  将范围缩小至minNum和maxNum之间
  6. mapminmaxDirect<-function(xData, minNum , maxNum)
  7. {
  8.   if(!is.matrix(xData))
  9.   {
  10.     stop('error input current data')
  11.   }
  12.   
  13.   N<-nrow(xData)
  14.   
  15.   #  每列的最大最小值
  16.   maxX <- matrix(apply(xData,2,max),nrow = 1)
  17.   
  18.   minX <- matrix(apply(xData,2,min),nrow = 1)
  19.   
  20.   #  针对x的数据进行转换
  21.   maxXMat <- matrix(rep(maxX , N),nrow = N ,byrow = TRUE)
  22.   minXMat <- matrix(rep(minX , N),nrow  = N , byrow = TRUE)
  23.   
  24.   #  转换为新的数据
  25.   xTransform <- (maxNum - minNum)/(maxXMat - minXMat)*(xData - minXMat)+
  26.     minNum
  27.   result<-list()
  28.   
  29.   #  返回的结果
  30.   
  31.   result$maxNum<-maxNum
  32.   result$minNum <- minNum
  33.   result$xTransform <- xTransform
  34.   result$minX<-minX
  35.   result$maxX <- maxX
  36.   
  37.   return(result)
  38.   
  39. }
复制代码



随后是反归一化函数

本帖隐藏的内容

  1. #  数据进行归一化当然还需要进行反归一化
  2. #  反归一化函数
  3. mapminmaxReverse<-function(xData , modelMapminmax)
  4. {
  5.   if(!is.list(modelMapminmax))
  6.   {
  7.     stop('error input data')
  8.   }
  9.   
  10.   if (!setequal(c("maxNum","minNum","xTransform","minX","maxX" ),
  11.                names(modelMapminmax)))
  12.   {
  13.     stop('error input data list')
  14.   }
  15.   
  16.   N <- nrow(xData)
  17.   
  18.   maxX<-modelMapminmax$maxX
  19.   minX<-modelMapminmax$minX
  20.   maxNum<-modelMapminmax$maxNum
  21.   minNum<-modelMapminmax$minNum
  22.   
  23.   maxXMat <- matrix(rep(maxX , N),nrow = N ,byrow = TRUE)
  24.   minXMat <- matrix(rep(minX , N),nrow  = N , byrow = TRUE)
  25.   
  26.   preX<-(xData - minNum)/(maxNum - minNum)*(maxXMat - minXMat)+minXMat
  27.   return(preX)
  28.    
  29.   
  30. }


  31. #  数据的重归一化
  32. mapminmaxPre<-function(xData , modelMapminmax)
  33. {
  34.   if(!is.list(modelMapminmax))
  35.   {
  36.     stop('error input data')
  37.   }
  38.   
  39.   if (!setequal(c("maxNum","minNum","xTransform","minX","maxX" ),
  40.                 names(modelMapminmax)))
  41.   {
  42.     stop('error input data list')
  43.   }
  44.   
  45.   maxX<-modelMapminmax$maxX
  46.   minX<-modelMapminmax$minX
  47.   maxNum<-modelMapminmax$maxNum
  48.   minNum<-modelMapminmax$minNum
  49.   
  50.   N<-nrow(xData)
  51.   
  52.   maxXMat <- matrix(rep(maxX , N),nrow = N ,byrow = TRUE)
  53.   minXMat <- matrix(rep(minX , N),nrow  = N , byrow = TRUE)
  54.   
  55.   #  转换为新的数据
  56.   xNew <- (maxNum - minNum)/(maxXMat - minXMat)*(xData - minXMat)+
  57.     minNum
  58.   return(xNew)
  59.   
  60. }


  61. #  归一化函数的检测
  62. xData <- matrix(rnorm(100,mean = 0,sd = 1),nrow = 25)
  63. #  -1至1之间的归一化
  64. result<-mapminmaxDirect(xData , -1 ,1)
  65. #  反归一化
  66. mapminmaxReverse(result$xTransform , result)
  67. xNewData<-matrix(rnorm(60,mean = 0,sd = 1),nrow = 15)
  68. mapminmaxPre(xNewData , result)
复制代码




1.2 概率神经网络(PNN)源码:

本帖隐藏的内容

  1. #  概率神经网络
  2. pnn<-function(xData , classX , testData ,Sigma)
  3. {
  4.   if(!is.matrix(xData) || !is.matrix(classX) || !is.matrix(testData))
  5.   {
  6.     stop('error input current data')
  7.   }
  8.   
  9.   if(ncol(xData)!=ncol(testData))
  10.   {
  11.     stop('error input data')
  12.   }
  13.   
  14.   nxData<-nrow(xData)
  15.   ntestData<-nrow(testData)
  16.   
  17.   disMatrix<-matrix(0,ntestData , nxData)
  18.   
  19.   #  首先将数据进行归一化
  20.   
  21.   minNum <-(-1)
  22.   maxNum <- 1
  23.   
  24.   result<-mapminmaxDirect(xData ,minNum , maxNum )
  25.   xNewData <- result$xTransform
  26.   testNewData<-mapminmaxPre(testData , result)
  27.   
  28.   #  首先计算disMatrix
  29.   for (i in c(1:ntestData))
  30.   {
  31.     oneTest<-testNewData[i,,drop = FALSE]
  32.     oneTestMat <- matrix(rep(oneTest , nxData),nrow = nxData , byrow = TRUE)
  33.     #  采用欧式距离
  34.     disMatrix[i,]<-sqrt(apply((oneTestMat - xNewData)^2,1,sum))
  35.    
  36.   }
  37.   #  初始概率矩阵
  38.   probMatrix<-exp(-disMatrix/(2*Sigma^2))
  39.   
  40.   totalClass <-sort(unique(classX))
  41.   
  42.   lastProbMatrix<-matrix(0,ntestData , length(totalClass))
  43.   
  44.   for (i in c(1:ntestData))
  45.   {
  46.     pro<-probMatrix[i,,drop = FALSE]
  47.     for (j  in c(1:length(totalClass)))
  48.     {
  49.       ijIndex<-which(classX == totalClass[j])
  50.       lastProbMatrix[i,j]<-sum(pro[ijIndex])
  51.     }
  52.    
  53.   }
  54.   
  55.   #  最后根据lastProbMatrix进行评价
  56.   pos<-apply(lastProbMatrix,1,which.max)
  57.   return(pos)
  58.   
  59. }
复制代码



一个Demo:
  1. Sigma<-1

  2. xData1 <-matrix(runif(10,0,1),ncol = 2)
  3. xData2<-matrix(runif(10,1,2),ncol = 2)
  4. xData3 <-matrix(runif(10,2,3),ncol = 2)
  5. xData<-rbind(xData1,xData2,xData3)

  6. classX<-rbind(matrix(1,nrow = 5),matrix(2,nrow = 5),
  7.               matrix(3,nrow = 5))
  8. testData1 <-matrix(runif(10,0,1),ncol = 2)
  9. testData2<-matrix(runif(10,1,2),ncol = 2)
  10. testData3 <-matrix(runif(10,2,3),ncol = 2)
  11. testData<-rbind(testData3,testData2,testData1)
  12. pnn(xData , classX , testData ,Sigma)
  13. #  ans [1] 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1
  14. #  eof
复制代码



关键词:神经网络 神经网 R语言 function Direct 网络

已有 6 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
我的素质低 + 100 + 100 精彩帖子
Nicolle + 100 + 100 + 1 + 1 + 1 精彩帖子
zbin7451f + 100 + 5 + 5 + 5 对论坛有贡献
xddlovejiao1314 + 100 + 100 + 5 + 5 + 5 精彩帖子
niuniuyiwan + 60 + 60 + 5 + 5 + 5 精彩帖子
刺客王朝 + 5 + 2 + 2 + 2 精彩帖子

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

本帖被以下文库推荐

刺客王朝 学生认证  发表于 2015-8-23 15:00:08 |显示全部楼层

回帖奖励 +3 个论坛币

看看
已有 2 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论
niuniuyiwan + 3 热心帮助其他会员

总评分: 经验 + 10  论坛币 + 6   查看全部评分

回复

使用道具 举报

刺客王朝 学生认证  发表于 2015-8-23 15:01:11 |显示全部楼层

回帖奖励 +3 个论坛币

好东西,多谢了
已有 1 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3   查看全部评分

回复

使用道具 举报

niuniuyiwan 在职认证  发表于 2015-8-23 15:28:54 |显示全部楼层

回帖奖励 +3 个论坛币

博观而约取,厚积而薄发,感谢分享,感谢楼主!
已有 1 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3   查看全部评分

回复

使用道具 举报

Crsky7 发表于 2015-8-23 15:52:13 |显示全部楼层

回帖奖励 +3 个论坛币

概率神经网络(PNN)应当用SAS来做
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
fantuanxiaot + 50 + 5 + 5 + 5 精彩帖子
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论
niuniuyiwan + 5 分析的有道理

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

回复

使用道具 举报

Elena3 发表于 2015-8-23 16:52:40 |显示全部楼层

回帖奖励 +3 个论坛币

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

总评分: 经验 + 10  论坛币 + 3   查看全部评分

回复

使用道具 举报

lipj 在职认证  发表于 2015-8-23 19:24:14 |显示全部楼层

回帖奖励 +3 个论坛币

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

总评分: 经验 + 10  论坛币 + 3   查看全部评分

回复

使用道具 举报

hlw 在职认证  发表于 2015-8-24 08:03:53 |显示全部楼层

回帖奖励 +3 个论坛币

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

总评分: 经验 + 10  论坛币 + 3   查看全部评分

回复

使用道具 举报

Alfred_G 学生认证  发表于 2015-8-24 08:22:56 |显示全部楼层

回帖奖励 +3 个论坛币

感谢分享
已有 1 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3   查看全部评分

回复

使用道具 举报

wangfs111222 发表于 2015-8-24 10:03:30 |显示全部楼层

回帖奖励 +3 个论坛币

gooooooooooooooood
已有 1 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3   查看全部评分

回复

使用道具 举报

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

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

GMT+8, 2020-1-28 16:34