基于MATLAB的遗传算法优化的神经网络房价预测实战(附完整代码)

基于MATLAB的遗传算法优化的神经⽹络房价预测实战(附完整代码)
本⽂利⽤BP神经⽹络对美国波⼠顿的房价进⾏预测,并针对BP神经⽹络存在的易陷⼊局部极⼩值,收敛速度慢,⽹络拓扑结构不稳定等问题,提出运⽤GA遗传算法对BP神经⽹络的初始权值和阈值进⾏优化。分别对传统神经⽹络和GA_BP进⾏训练和仿真,结果表明,经遗传算法优化后的神经⽹络可以加快⽹络收敛速度,提⾼预测房价的精度。
1. 概述
随着房地产市场⾏业快速迅猛的发展,⼈们越来越关注放价的⾛势。从宏观上来看,影响房价的因素分为房地产⾃⾝因素和房地产外部因素。⾃⾝因素主要包括:区位因素、实物因素和权益因素。外部因素主要包括:⼈⼝因素、制度因素、经济因素、社会因素和国际因素。由此可看出,影响房价的因素很多。在本⽂的研究中,我们只选取部分影响房价的因素进⾏分析。
⼈⼯神经⽹络是基于模仿⼈脑系统的结构和功能,反映⼈脑某些特性的⼀种智能信息处理系统。⼈⼯神经⽹络具有并⾏处理能⼒、⾃学习和⾃适应等特性。同时,它还具有⾮线性映射、优化计算、联想记忆等功能。⽬前,⼈⼯神经⽹络已经在很多领域得到了⼴泛的应⽤。这些应⽤领域主要包括智能检测、⾮线性预测、模式识别、机器⼈控制等。随着⼈⼯神经⽹络的进⼀步发展和更加深⼊的研究,⼈⼯神经⽹络应⽤的领域越来越⼴泛。因此,本⽂提出利⽤遗传算法优化的 BP 神经⽹络来建⽴房价预测模型。
2. BP神经⽹络及遗传算法
BP 神经⽹络(Back Propagation Neural Network)也称为反向传播神经⽹络,是⼀种具有 3 层或 3 层以上结构的⽆反馈的、层内⽆
互连的⽹络,其结构如图所⽰。
BP 神经⽹络除输⼊层和输出层外,还包括⼀个或多个隐含层,各个层神经元之间实现全连接,⽽同层内各神经元之间⽆连接。BP神经⽹络通过有指导的学习⽅式进⾏学习和训练。标准的BP学习算法采⽤误差函数按梯度下降的⽅法学习,使⽹络的实际输出值和期望输出值之间的均⽅误差最⼩。BP神经⽹络的学习过程主要是由输⼊信号正向传播和误差反向传播构成的。在正向传播时,输⼊信号从输⼊层输⼊,经过隐含层的逐层处理后,传递给输出层。若输出层的实际输出与期望输出不符,则转⼊误差反向传播过程。反向传播的过程就是由输出层向输⼊层逐层修正连接权值使误差减⼩。输⼊信号的正向传播与误差的反向传播过程是循环进⾏的。BP神经⽹络的训练过程就是不断调整连接权值的过程,这个过程进⾏到输出的均⽅误差达到要求的标准。
遗传算法(Genetic Algorithm, GA)是模拟⽣物在⾃然界进化过程中的遗传选择和⾃然淘汰的⼀种计算模型。它是⼀种具有很强的全局搜索能⼒和全局优化性能的算法。遗传算法主要包括选择、交叉和变异等操作。它的主要优点是鲁棒性强、简单通⽤,能够⽤于并⾏分布式处理。因此,将遗传算法与 BP 神经⽹络相结合,训练⽹络时先⽤遗传算法对神经⽹络的权值和阈值进⾏寻优,缩⼩搜索范围之后,再利⽤ BP 神经⽹络对问题进⾏求解。
3. BP神经⽹络的房价预测模型设计
3.1数据选择
实验数据的选取对⽹络模型的预测结果影响很⼤,所以选取的样本数据要尽可能真实客观地反映房价的变化规律。选取的房价影响因素不仅要合理,⽽且还要具有代表性。分析影响房价的所有因素是不现实的,在本⽂的研究中,选取了13 个房价影响因素。我们使⽤的训练数据来⾃于美国,数据源地址为archive.ics.uci.edu/ml/machine-learning-databases/housing/。美国政府公开了很多公共数据以便社会研究,在我们使⽤的Keras框架中,包含了美国1970年波⼠顿郊区的房地产相关信息,例如犯罪率,房地产税,不同户型的房价等等。选取输⼊数据有以下13个
CRIM:城镇⼈均犯罪率
ZN:住宅⽤地所占⽐例
横断面INDUS:城镇中⾮商业⽤地所占⽐例
CHAS:CHAS查尔斯河虚拟变量,⽤于回归分析
NOX:环保指标
RM:每栋住宅房间数
AGE:1940年前建成的⾃主单位⽐例
DIS:距离5个波⼠顿就业中⼼加权距离
RAD:距离⾼速公路的便利指数hbv疫苗
TAX:每⼀万美元的不动产税率
PTRATIO:城镇中教师学⽣⽐例
B:城镇中⿊⼈⽐例
LSTAT:城区多少百分⽐房东为低收⼊阶层
MEDV:⾃住房屋房价中位数
3.2数据预处理
本次选取数据来源有以下⼏个特点:第⼀,是数据量很⼩,数据总量共五百多条;第⼆,数据的格式不⼀样,有些数据以百分⽐来表⽰,有些数据处于范围1到12,⽽有些数据范围在0到100,因此⾸先需要对数据进⾏预处理。由于不同的数据有不同的数量级,因此为了提⾼⽹络运算速率,便于⽹络计算以及提⾼预测的准确性,需要对数据进⾏归⼀化处理。基于MATLAB我们采⽤mapminmax 函数,输⼊样本归⼀化为:
[pn_train,ps1] = mapminmax(p_train’);
pn_test = mapminmax(‘apply’,p_test’,ps1);
其中PS1是训练样本的数据的映射,记录了训练集的归⼀化⽅法,即PS1中包含了训练数据的最⼤值和最⼩值,式中pn_test是测试样本,对于测试样本来说,预处理应该和训练样本⼀致,即测试样本的最⼤值和最⼩值应该是训练集的最⼤值与最⼩值。对于测试集需要同样⽤ps1⽅法进⾏归⼀化。
3.3数据建模
3.3.1 初始化参数设定
本⽂采⽤newff来创建⽹络,设置隐藏神经元个数为5个,训练⽹络性能所采⽤的的函数为trainlm默认函数,其适合中型⽹络,对内存的需求⼤,但收敛速度快。设置训练次数为20000次,收敛误差为0.0000001,。初始的权值和阈值为系统默认值。
3.3.2 隐含节点数确定
本⽂实验选取3 层结构的BP 神经⽹络进⾏预测模型的建⽴。若隐层节点数太少,⽹络可能⽆法训练或性能很差;若隐层节点数太多,虽然可减⼩⽹络的系统误差,但⽹络训练时间延长,并且训练容易陷⼊局部极⼩点⽽得不到最优点,也是训练时出现“过拟合”的内在原因。因此,合理隐层节点数应在综合考虑⽹络结构复杂程度和误差⼤⼩的情况下⽤节点删除法和扩张法确定。BP神经⽹络的隐含层节点通常⽤试凑法确定,可以先设置较少的隐含层节点来训练⽹络,然后逐渐增加隐含层节点数,使⽤同⼀样本集进⾏训练,最终选取⽹络误差最⼩时对应的隐含层节点数。在实验中,往往根据经验公式得到⼀个粗略的估计值作为初始值,再⽤试凑法确定最佳节点数。常⽤的经验公式为:
其中,n为输⼊层节点数
3.4模型训练与仿真
采⽤Matlab作为软件平台,利⽤神经⽹络⼯具箱函数编程实现BP神经⽹络预测模型的构建、训练和仿真。将收集到的样本分为2 个部分:选取前80%作为训练样本,剩下的20%数据作为测试验证样本。
4. 经遗传算法优化的BP神经⽹络模型
遗传算法是模拟达尔⽂⽣物进化论的⾃然选择和遗传学机理的⽣物进化的计算模型,是⼀种通过模拟⾃然进化过程搜索最优解的⽅法。由于BP神经⽹路的学习收敛速度太慢,易陷⼊局部极⼩值,⽹络拓扑结构不稳定等问题,因此⽤遗传算法优化的BP神经⽹络模型(GA-BP神经⽹络)。GA⽤于函数优化的⽬的就是发现问题的全局最优解,以此来提⾼预测的精度。
4.1参数的选取
在BP神经⽹络中,隐层节点数的选择⾮常重要,他不仅很⼤影响了神经⽹络模型的性能,⽽且是训练时出现“过拟合”的直接原因。
确定隐含层基本条件有两点:第⼀,隐层节点数必须⼩于N-1;第⼆,训练样本必须多余⽹络模型的连接权重,⼀般为2到10倍。对
于本次实验,GA-BP神经⽹络采⽤3层⽹络结构,输⼊层神经元个数为13,隐含层神经元个数为13,输出层神经元的个数为1。
4.2GA-BP神经⽹络优化的实验步骤
GA-BP神经⽹络的实现步骤为:
(1)个体编码与创建初始化种
遗传算法是对体进⾏的进化操作,设置迭代次数为100次,种规模为10,对个体编码长度规则为:
其中,m为隐含层节点数,n为输⼊层节点数,l为输出层节点数。
(2)适应度计算
此处我们调⽤fun函数实现对其适应度的计算,神经⽹络的预测误差越⼩,对应的适应度函数就越⼩,适应度就越好。
(3)交叉和变异操作
交叉运算是遗传算法中产⽣新个体的主要操作过程,变异运算是对个体的某⼀个或某⼀些基因座上的基因值按某⼀较⼩的概率进⾏改变,也是产⽣新个体的⼀种⽅法。对于最优个体没有进⾏交叉操作,⽽是直接复制到下⼀代。通常设置交叉和变异概率为0到1之间,此处取变交叉概率为0.3,变异概率为0.1。
5. 实验结果分析
如图所⽰为没有加⼊遗传算法的BP神经⽹络预测结果,其中平均预测误差为0.5754,预测均⽅误差:4.6101
如图所⽰为加⼊遗传算法的BP神经⽹络预测效果图,我们可以得到平均误差为0.30583,均⽅误差为3.7968。
如图 所⽰为得到的适应度曲线,此处适应度代表预测值与实际值的差值,在进化代数接近60的时候达到了最优适应度。
6. 结束语
传统的BP神经⽹络存在收敛速度慢,容易陷⼊局部极⼩值的问题,因此将遗传算法与 BP 神经⽹络相结合,训练⽹络时先⽤遗传算法对神经⽹络的权值和阈值进⾏寻优,缩⼩搜索范围之后,再利⽤ BP 神经⽹络对问题进⾏求解。根据得到的仿真结果表⽰,利⽤GA-BP神经⽹络预测房价,可以很⼤程度上提⾼收敛速度,同时提⾼预测的准确度。
7. 完整代码
clc
clear
%
%% ⽹络结构建⽴
%读取数据
filename = '';
inputNames = {'CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT'};
outputNames = {'MEDV'};
housingAttributes = [inputNames,outputNames];
%%Import Data
formatSpec = '%8f%7f%8f%3f%8f%8f%7f%8f%4f%7f%7f%7f%7f%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', '', 'WhiteSpace', '', 'ReturnOnError', false);
fclose(fileID);
housing = table(dataArray{1:end-1}, 'VariableNames', {'VarName1','VarName2','VarName3','VarName4','VarName5','VarName6','VarName7','VarName8',' VarName9','VarName10','VarName11','VarName12','VarName13','VarName14'})
%%Read into a Table
housing.Properties.VariableNames = housingAttributes;
features = housing{:,inputNames};
prices = housing{:,outputNames};
%节点个数
inputnum=13; %输⼊层节点数
hiddennum=13;%隐含层节点数
outputnum=1; %输出层节点数
%训练数据和预测数据
len = length(prices);
index = randperm(len);%⽣成1~len 的随机数
%input_train = features(index(1:round(len*0.8)),:);%训练样本输⼊
%output_train = prices(index(1:round(len*0.8)),:);%训练样本输出
%input_test = features(index(round(len*0.8)+1:end),:);%测试样本输⼊
%output_test = prices(index(round(len*0.8)+1:end),:);%测试样本输出
%output_test = prices(index(round(len*0.8)+1:end),:);%测试样本输出
input_train=features(index(1:405),:)';
input_test=features(index(406:506),:)';
output_train=prices(index(1:405))';
output_test=prices(index(406:506))';
%选连样本输⼊输出数据归⼀化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%构建⽹络
net=newff(inputn,outputn,hiddennum);
%% 遗传算法参数初始化
maxgen=100;                        %进化代数,即迭代次数
sizepop=10;                        %种规模
玛格丽特米切尔pcross=[0.3];                      %交叉概率选择,0和1之间
pmutation=[0.1];                    %变异概率选择,0和1之间
%节点总数
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
lenchrom=ones(1,numsum);
bound=[-2*ones(numsum,1) 2*ones(numsum,1)];    %数据范围
%--------------------------------------种初始化--------------------------------------------------------
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %将种信息定义为⼀个结构体
avgfitness=[];                      %每⼀代种的平均适应度
bestfitness=[];                    %每⼀代种的最佳适应度
bestchrom=[];                      %适应度最好的染⾊体
%初始化种
for i=1:sizepop
%随机产⽣⼀个种
individuals.chrom(i,:)=Code(lenchrom,bound);    %编码(binary和grey的编码结果为⼀个实数,float的编码结果为⼀个实数向量)    %Code函数⽤于编码,lenchrom是染⾊体长度,bound是变量的取值范围
x=individuals.chrom(i,:);
%计算适应度
individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);  %染⾊体的适应度
%fun函数(BP神经⽹络预测,记录预测误差,inputn为训练输⼊数据,outputn为训练输出数据)
end
%最好的染⾊体
[bestfitness bestindex]=min(individuals.fitness);
工程管理系统bestchrom=individuals.chrom(bestindex,:);  %最好的染⾊体
avgfitness=sum(individuals.fitness)/sizepop; %染⾊体的平均适应度
% 记录每⼀代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness];
%% 迭代求解最佳初始阀值和权值
% 进化开始
for i=1:maxgen
disp(['遗传迭代第',num2str(i),'次'])
% 选择
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%交叉
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
% 变异
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
% 计算适应度
for j=1:sizepop
x=individuals.chrom(j,:); %解码石像
individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);
end
%到最⼩和最⼤适应度的染⾊体及它们在种中的位置
黄建始

本文发布于:2024-09-22 01:41:25,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/50591.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:神经   数据   因素   训练   预测   房价
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议