本帖隐藏的内容
1.1首先需要构造归一化函数:
本帖隐藏的内容
- # function
- # 基于高斯核函数
- # 首先是矩阵的归于化的函数
- # 模仿matlab的归一化mapminmax函数
- # 将范围缩小至minNum和maxNum之间
- mapminmaxDirect<-function(xData, minNum , maxNum)
- {
- if(!is.matrix(xData))
- {
- stop('error input current data')
- }
-
- N<-nrow(xData)
-
- # 每列的最大最小值
- maxX <- matrix(apply(xData,2,max),nrow = 1)
-
- minX <- matrix(apply(xData,2,min),nrow = 1)
-
- # 针对x的数据进行转换
- maxXMat <- matrix(rep(maxX , N),nrow = N ,byrow = TRUE)
- minXMat <- matrix(rep(minX , N),nrow = N , byrow = TRUE)
-
- # 转换为新的数据
- xTransform <- (maxNum - minNum)/(maxXMat - minXMat)*(xData - minXMat)+
- minNum
- result<-list()
-
- # 返回的结果
-
- result$maxNum<-maxNum
- result$minNum <- minNum
- result$xTransform <- xTransform
- result$minX<-minX
- result$maxX <- maxX
-
- return(result)
-
- }
随后是反归一化函数
本帖隐藏的内容
- # 数据进行归一化当然还需要进行反归一化
- # 反归一化函数
- mapminmaxReverse<-function(xData , modelMapminmax)
- {
- if(!is.list(modelMapminmax))
- {
- stop('error input data')
- }
-
- if (!setequal(c("maxNum","minNum","xTransform","minX","maxX" ),
- names(modelMapminmax)))
- {
- stop('error input data list')
- }
-
- N <- nrow(xData)
-
- maxX<-modelMapminmax$maxX
- minX<-modelMapminmax$minX
- maxNum<-modelMapminmax$maxNum
- minNum<-modelMapminmax$minNum
-
- maxXMat <- matrix(rep(maxX , N),nrow = N ,byrow = TRUE)
- minXMat <- matrix(rep(minX , N),nrow = N , byrow = TRUE)
-
- preX<-(xData - minNum)/(maxNum - minNum)*(maxXMat - minXMat)+minXMat
- return(preX)
-
-
- }
- # 数据的重归一化
- mapminmaxPre<-function(xData , modelMapminmax)
- {
- if(!is.list(modelMapminmax))
- {
- stop('error input data')
- }
-
- if (!setequal(c("maxNum","minNum","xTransform","minX","maxX" ),
- names(modelMapminmax)))
- {
- stop('error input data list')
- }
-
- maxX<-modelMapminmax$maxX
- minX<-modelMapminmax$minX
- maxNum<-modelMapminmax$maxNum
- minNum<-modelMapminmax$minNum
-
- N<-nrow(xData)
-
- maxXMat <- matrix(rep(maxX , N),nrow = N ,byrow = TRUE)
- minXMat <- matrix(rep(minX , N),nrow = N , byrow = TRUE)
-
- # 转换为新的数据
- xNew <- (maxNum - minNum)/(maxXMat - minXMat)*(xData - minXMat)+
- minNum
- return(xNew)
-
- }
- # 归一化函数的检测
- xData <- matrix(rnorm(100,mean = 0,sd = 1),nrow = 25)
- # -1至1之间的归一化
- result<-mapminmaxDirect(xData , -1 ,1)
- # 反归一化
- mapminmaxReverse(result$xTransform , result)
- xNewData<-matrix(rnorm(60,mean = 0,sd = 1),nrow = 15)
- mapminmaxPre(xNewData , result)
1.2 概率神经网络(PNN)源码:
本帖隐藏的内容
- # 概率神经网络
- pnn<-function(xData , classX , testData ,Sigma)
- {
- if(!is.matrix(xData) || !is.matrix(classX) || !is.matrix(testData))
- {
- stop('error input current data')
- }
-
- if(ncol(xData)!=ncol(testData))
- {
- stop('error input data')
- }
-
- nxData<-nrow(xData)
- ntestData<-nrow(testData)
-
- disMatrix<-matrix(0,ntestData , nxData)
-
- # 首先将数据进行归一化
-
- minNum <-(-1)
- maxNum <- 1
-
- result<-mapminmaxDirect(xData ,minNum , maxNum )
- xNewData <- result$xTransform
- testNewData<-mapminmaxPre(testData , result)
-
- # 首先计算disMatrix
- for (i in c(1:ntestData))
- {
- oneTest<-testNewData[i,,drop = FALSE]
- oneTestMat <- matrix(rep(oneTest , nxData),nrow = nxData , byrow = TRUE)
- # 采用欧式距离
- disMatrix[i,]<-sqrt(apply((oneTestMat - xNewData)^2,1,sum))
-
- }
- # 初始概率矩阵
- probMatrix<-exp(-disMatrix/(2*Sigma^2))
-
- totalClass <-sort(unique(classX))
-
- lastProbMatrix<-matrix(0,ntestData , length(totalClass))
-
- for (i in c(1:ntestData))
- {
- pro<-probMatrix[i,,drop = FALSE]
- for (j in c(1:length(totalClass)))
- {
- ijIndex<-which(classX == totalClass[j])
- lastProbMatrix[i,j]<-sum(pro[ijIndex])
- }
-
- }
-
- # 最后根据lastProbMatrix进行评价
- pos<-apply(lastProbMatrix,1,which.max)
- return(pos)
-
- }
一个Demo:
- Sigma<-1
- xData1 <-matrix(runif(10,0,1),ncol = 2)
- xData2<-matrix(runif(10,1,2),ncol = 2)
- xData3 <-matrix(runif(10,2,3),ncol = 2)
- xData<-rbind(xData1,xData2,xData3)
- classX<-rbind(matrix(1,nrow = 5),matrix(2,nrow = 5),
- matrix(3,nrow = 5))
- testData1 <-matrix(runif(10,0,1),ncol = 2)
- testData2<-matrix(runif(10,1,2),ncol = 2)
- testData3 <-matrix(runif(10,2,3),ncol = 2)
- testData<-rbind(testData3,testData2,testData1)
- pnn(xData , classX , testData ,Sigma)
- # ans [1] 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1
- # eof