智能算法:library(mcga)#mcga的形式#function(popsize,chsize,crossprob=1,mutateprob=0.01,elitism=1,minval,maxval,maxiter=10,evalFunc)#参数说明:#popsize,个体数量,即染色体数目#chsize,基因数量,限参数的数量#crossprob,交配概率,默认为1.0#mutateprob,突变概率,默认为0.01#elitism,精英数量,直接复制到下一代的染色体数目,默认为1#minval,随机生成初始种群的下边界值#maxval,随机生成初始种群的上边界值#maxiter,繁殖次数,即循环次数,默认为10#evalFunc,适应度函数,用于给个体进行评价#接下来,我们给定一个优化的问题,通过mcga()函数,计算最优化的解。#定义适应度函数f-function(x){-0.5+((sin(sqrt(x[1]^2+x[2]^2)))^2-0.5)/((1+0.01*(x[1]^2+x[2]^2))^2)}m=mcga(popsize=200,chsize=2,minval=c(-10,-10),maxval=c(10,10),evalFunc=f)print(m$population[1,])f(m$population[1,])运行结果:[1]0.0000000005924311244-0.0000000010027990784[1]-1例2求解下列优化问题maxf(x)=20+x12+x22-10(cos(2x1)+cos(2x2))x1(0,10)x2(0,5)library(genalg)#定义适应度函数f-function(x){20+x[1]^2+x[2]^2-10*(cos(2*pi*x[1])+cos(2*pi*x[2]))}#代码省略#定义监控函数monitor-function(obj){#plotthepopulationxlim=c(obj$stringMin[1],obj$stringMax[1]);ylim=c(obj$stringMin[2],obj$stringMax[2]);plot(obj$population,xlim=xlim,ylim=ylim)}#运行遗传算法m2=rbga(c(5*pi,-20*pi),c(20*pi,-4*pi),popSize=100,iters=1000,evalFunc=f,mutationChance=0.01,verbose=TRUE,monitorFunc=monitor)m2$population[1,]f(m2$population[1,])运行结果:m2$population[1,][1]15.84860252-12.97406607f(m2$population[1,])[1]423.8304683例3求解非线性规划问题,其目标函数为非连续的四元函数:41min(1)sin(10)01iiiizxxxxlibrary(gafit)f-function(x){if(all(0x)&all(x1))y=sum(-abs((1-x)*x^2*sin(10*pi*x)))elsey=Infy}gafit(expression(f(x)),thermal=0.005,samples=100,list(x=rep(0.2,4)),maxiter=500)$x[1]0.65020312650.74867935710.65022357340.6502076160attr(,score)[1]-0.5843848993attr(,count)[1]500神经网络:setwd(E:/数据及程序/chapter5/示例程序)#读入数据Data-read.csv(./data/sales_data.csv)[,2:5]#数据命名library(nnet)colnames(Data)-c(x1,x2,x3,y)#最终模型model1-nnet(y~.,data=Data,size=6,decay=5e-4,maxit=1000)pred-predict(model1,Data[,1:3],type=class)(P-sum(as.numeric(pred==Data$y))/nrow(Data))table(Data$y,pred)prop.table(table(Data$y,pred),1)我们将要使用neuralnet包来创建神经网络模型,并创建一个线性回归模型来与此进行比较。数据集:我们将调用MASS包来使用Boston数据集。Boston数据集就是关于Boston郊区的房价的数据集。我们的目标就是通过使用其它可行的连续变量来预测为个人所有的房屋的房价的中位数。set.seed(500)library(MASS)data-Boston首先,我们需要确认任何数据都不含有缺失值,而我们则要对此数据集进行一定的修正。apply(data,2,function(x)sum(is.na(x)))很好,没发现任何缺失值。现在,我们要把这个数据集,以随机的方式把它们划分为训练数据集和测试数据集,然后在此创建一个线性模型,并使用测试数据集进行测试。在这里,我们将使用glm()函数而不是lm()函数,那是因为后面我们要对线性模型进行交叉检验的时候,glm()函数会更有效。index-sample(1:nrow(data),round(0.75*nrow(data)))train-data[index,]test-data[-index,]lm.fit-glm(medv~.,data=train)summary(lm.fit)pr.lm-predict(lm.fit,test)MSE.lm-sum((pr.lm-test$medv)^2)/nrow(test)sample(x,size)函数简单的输出了一个向量,它是从x向量当中,基于一个特定的大小随机选出来的一个模型。在默认情况下,抽样时我们无需对此进行转换:index就能很好体现这个样本就是随机抽样了。由于我们要处理线性回归模型,我们将要使用均值方差(MSE)作为一个指标来预测我们模型的拟合程度有多少。对拟合一个神经网络模型做相应的准备在拟合一个神经网络模型之前,我们需要做一些准备工作。毕竟,神经网络的训练和调试不是这么容易的。第一步,我们需要对数据集进行预处理。在训练神经网络模型之前,对数据集进行准则化处理是一个不错的选择。我不想在这里强调这一步有多么的重要:基于你的数据集,如果没有对数据集进行准则化处理,这可能会导致一些对分析毫无意义的结果的出现,使得训练过程进行的很艰难(大多数情况下,算法在到达最大允许迭代次数之前,是不会聚合的)。当然,你可以使用不同的方法来分析这个数据(z准则化、最大最小测试等等)。这里,我采用最大最小值得方法,并基于区间[0,1]来测量数据。通常来说,基于区间[0,1]或[-1,1]进行测量似乎能得到更好的结果。因此,在进行下一步操作之前,我们先测量和分离数据集:maxs-apply(data,2,max)mins-apply(data,2,min)scaled-as.data.frame(scale(data,center=mins,scale=maxs-mins))train_-scaled[index,]test_-scaled[-index,]记住,scale函数返回的结果是一个矩阵。因此,我们需要把它强制转换成数据框的格式。参数我目前所获悉的,就是目前还没有一个绝对的准则能让我们知道我们要用多少层和多少个神经元,就算目前已经有一些被大部分人所接受的一些重要准则可以进行辅助也不能解决这样的问题。通常来说,如果所有的都需要,一个隐含的层就可以进行大量使用了。一旦我们能确认神经元的数量,它应当处在输入层和输出层之间,通常情况下,输入层占其中的2/3。最少,我那些短暂的进行一次又一次测试的经历似乎是最好的答案,因为我们无法保证这里的任何一条规则都能在最好的情况下符合你的模型。因为这是一个用处不大的实例,我们将根据这个规则对两个层进行隐藏。其中,输入层有13个输入值,两个隐藏层分别有5个和3个神经元,而输出层,因为我们是做回归分析,所以,只有一个输出值。现在,我们拟合一下这个网络:library(neuralnet)n-names(train_)f-as.formula(paste(medv~,paste(n[!n%in%medv],collapse=+)))nn-neuralnet(f,data=train_,hidden=c(5,3),linear.output=T)记住这么两点:1.基于某些原因,公式y~.不可以在neuralnet()函数当中使用。首先,你必须要写一个完整的公式,并把它当作是一个参数用到拟合函数当中。2.隐藏的变量可以使用一个数值型向量来设定每个隐藏层的神经元数目,而参数linear.output用于指定我们是否要进行回归分析,此时,我们设定参数linear.output=TRUE,或者,分类,linear.output=FALSE。nerualnet包提供了一个很好的作图工具:plot(nn)图中的黑线表示每一层与其相关权重直接的关系,而蓝色线表示拟合过程中,每一步被添加到蓝色线上的误差项。而这些误差可以表示一个线性模型的误差区间。这个网络本质上就是一个黑匣子。因此,对于它的拟合效果、权重和模型说太多。不过,我们可以确信,这个训练算法实现了聚合的效果。因此,我们可以使用这个模型进行分析。使用神经网络预测私有房屋的价格现在,我们可以对测试集里的值进行预测并计算它的均值方差(MSE)。记住,神经网络会输出一个准则化预测。所以,我们需要重新对它进行测量和分析,以便于做一些有意义的比较。pr.nn-compute(nn,test_[,1:13])pr.nn_-pr.nn$net.result*(max(data$medv)-min(data$medv))+min(data$medv)test.r-(test_$medv)*(max(data$medv)-min(data$medv))+min(data$medv)MSE.nn-sum((test.r-pr.nn_)^2)/nrow(test_)现在,我们比较它们俩的均值误差。print(paste(MSE.lm,MSE.nn))[1]21.629759350722515.7518370200153显然,在预测私人房屋价格的时候,神经网络模型的性能优于线性模型。再次说明,我们任然要小心就是因为它的结果就是基于上面训练数据集分组时的性能。下面,做完图以后,我们会进行一个快速的交叉检验来使得结果更具有说服力。基于测试数据集的神经网络和线性模型的第一步可视化操作的图像如下:par(mfrow=c(1,2))plot(test$medv,pr.nn_,col='red',main='RealvspredictedNN',pch=18,cex=0.7)abline(0,1,lwd=2)legend('bottomright',legend='NN',pch=18,col='red',bty='n')plot(test$medv,pr.lm,col='blue',main='Realvspredictedlm',pch=18,cex=0.7)abline(0,1,lwd=2)legend('bottomright',legend='LM',pch=18,col='blue',bty='n',cex=0.7)通过对其图像进行检验,我们可以得知,由神经网络所作出的预测(一般情况下)要比那些线性模型所拟合出来的预测让散点更加靠近拟合线(一条完美的准线,它表示MSE为0。因此,这种预测的结果是理想的)。plot(test$medv,pr