找大神求助,我想用遗传算法优化神经网,程序如下,但出现了后面的问题:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找大神求助,我想用遗传算法优化神经网,程序如下,但出现了后面的问题:相关的知识,希望对你有一定的参考价值。
function net=GABPNET(XX,YY)
% 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络
% 在‘E:\shuju’下调用训练数据
XX=xlsread('E:\shuju\1.xls');
YY=xlsread('E:\shuju\2.xls');
% 矩阵转秩
XX=XX';
YY=YY';
% 数据归一化预处理
nntwarn off %去除使用工具箱产生的警告,不建议使用
XX=premnmx(XX);
YY=premnmx(YY);
%创建网络
net=newff(minmax(XX),[2,13,1],'tansig','tansig','purelin','trainlm');
%下面使用遗传算法对网络进行优化
P=XX;
T=YY;
R=size(P,1);%输入维数
S2=size(T,1);%输出维数
S1=13;%隐含层节点数
S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
aa=ones(S,1)*[-1,1];%变量上下项矩阵
popu=50;%种群规模
save data2 XX YY % 是将 xx,yy 二个变数的数值存入 data2 这个MAT-file,
initPpp=initializega(popu,aa,'gabpEval');%初始化种群
gen=100;%遗传代数
%下面调用gaot工具箱,其中目标函数定义为gabpEval,
[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
%绘收敛曲线图
figure(1)
plot(trace(:,1),1./trace(:,3),'r-');
hold on
plot(trace(:,1),1./trace(:,2),'b-');
xlabel('Generation');
ylabel('Sum-Squared Error');
figure(2)
plot(trace(:,1),trace(:,3),'r-');
hold on
plot(trace(:,1),trace(:,2),'b-');
xlabel('Generation');
ylabel('Fittness');
%下面将初步得到的权值矩阵赋给尚未开始训练的BP网络
[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
net.LW2,1=W1;
net.LW3,2=W2;
net.b2,1=B1;
net.b3,1=B2;
XX=P;
YY=T;
%设置训练参数
net.trainParam.show=1;
net.trainParam.lr=1;
net.trainParam.epochs=50;
net.trainParam.goal=0.001;
%训练网络
net=train(net,XX,YY);
a=sim(net,XX);
出现了下面的问题,求大神救助啊
??? Error using ==> feval
Undefined function or method 'normGeomSelect' for input arguments of type 'double'.
应该怎么定义啊
将遗传算法用于神经网络
【中文标题】将遗传算法用于神经网络【英文标题】:Using genetic algorithms for neural networks 【发布时间】:2011-06-30 05:19:11 【问题描述】:目前我正在研究一个使用遗传算法优化神经网络的项目。我确实意识到这可能不是优化它们的最佳方式,但我对这两者都是新手,所以我只是想尝试使用它们。
我的计划如下(可能会有很多变化)。我的输入神经元将使用一个数据集,该数据集几乎可以具有任何正数(包括最多两位的小数,所以它们实际上是浮点数),但最有可能在 0 到 20000 之间。因为重要性在于如何数字彼此比较的值而不是它们的大小,它们将首先除以将输入的所有值中的最大数字。他们会在进入隐藏层之前将它们乘以权重(任何正或负浮点数)。隐藏层中的每个神经元都会对它的所有输入求和,直到完成计算。然后它们将通过物流功能运行并输出。
我的环境是 Visual Studio C++ 2010 Express,我使用的是 clr。
我的问题在于遗传算法及其工作原理。这将是调整权重。我的问题是,当它在其中一个权重(突变率)中随机改变一点时,它可能会使权重非常高或非常低,当乘以输入并与其他相加时会导致溢出或其他错误。我也不知道如何组织我的染色体。那么,通过选择权重而不是随机位并将它们更改为定义范围内的随机数来执行随机化会更好吗?基本上,我正在寻找有关如何组织它而不导致错误的建议,使值最终过大或过小,同时保持性能。
谢谢,(如果这应该是理论计算机科学,很抱歉,但我认为它不适合那里)
【问题讨论】:
我不记得细节了,但是在这本书中:amazon.com/Techniques-Programming-Premier-Press-Development/dp/…,作者做了你所描述的差不多,即使用基因突变的权重值来优化神经网络。 看看您提出的解决方案与更传统的过程(甚至可能是非神经过程)之间的性能比较会很有趣。 【参考方案1】:(人工)神经网络 (ANN) 是出了名的难以优化,而遗传算法 (GA) 是一种相当不错的优化方法(主要是因为其他所有东西的工作效果都非常有限)。当然,也有一些效果很好的替代方案,但它们更复杂、更微妙,无法正确编程和调整(使用模拟退火和学习动量的反向传播)。我知道你做这个项目主要是为了玩这些东西。
您可能想看看进化神经控制器 (ENC),这是一个使用遗传(或进化)算法来训练 ANN 以完成复杂导航任务的领域(例如,行星际空间任务是我亲自研究过)。
对于 ANN 部分,我建议您不要将自己局限于物流功能(我知道 sigmoid 的灵感来自生物神经元,但这并不意味着它们一直都是最好的)。还存在许多其他功能,使用物流功能的部分原因是它们使反向传播更快、更简单。但是,径向基函数也能创造奇迹(IMO 和据我所见,大多数成功的 ANN 应用都使用径向基函数,即 RBF-NN)。通常,人们使用高斯函数、超球面函数,并且经常使用三角函数(称为模糊网络,另一个巨大的 ANN 类)。
至于 GA,出于您提到的原因,我不推荐您描述的那种突变类型(即翻转位)。人们在处理实值基因时不会使用这种突变。一种非常简单的突变方法是(以一定的概率)决定对个体进行突变,然后选择其基因的一个元素进行突变,然后使用随机数生成器(rand())简单地生成一个新的基因元素来替换它.有了这个,您可以限制生成的基因元素的规模,以避免使您的个体退化的问题(即一个完全错误的基因元素可以使整个个体无用)。基因是什么?好吧,对于 ANN,通常是一个包含网络中所有神经元权重的大向量。你可以猜到,如果神经元的数量太大,人们很少会应用 GA。我还建议您使用锦标赛选择来选择个体进行繁殖。至于交叉(即混合两个父母做一个孩子),只需保持权重的顺序,并为孩子的每个元素以相等的概率随机选择来自任一父母的权重。
我已经亲自完成了我上面描述的工作,它对于某些问题非常有效(减小了尺寸和高度复杂性,即没有明显的最佳解决方案)。
最后,不要指望它会那么容易工作。通常,它需要的种群规模和世代数量远远高于您的预期(毕竟,进化是一个非常缓慢的过程!)。所以,不要尝试 10 个人的种群并运行 50 代,然后遗憾地说“哦,我猜它行不通……”。当然,根据你所应用的问题的规模,以人口中数千个人和数千到十万代的顺序尝试更多。
【讨论】:
我明白你说的很多,感谢您非常详尽的回答,但我有一个问题。关于随机数生成,什么是最好的随机生成器,它可以在包括小数的范围内生成浮点随机数,而不仅仅是整数(.net、标准 C 库、boost 等)。 Boost.Random 是一种“复杂”的解决方案。但是,最简单的方法是使用 rand() 中的公式,例如double num = (rand() % 10000) * 0.001;
。这将产生一个从 0 到 10 的数字,十进制精度低至 0.001。就这么简单。但如果你对统计和概率分布函数有一点背景,你可能会发现 Boost.Random 更优雅一些。【参考方案2】:
您的问题在于染色体表示。它被称为汉明悬崖问题。您可以使用Gray Code 进行没有汉明悬崖问题的染色体表示
【讨论】:
呃,你能解释一下吗?我不明白“格雷码”与 ANN 或 GA 的关系...以上是关于找大神求助,我想用遗传算法优化神经网,程序如下,但出现了后面的问题:的主要内容,如果未能解决你的问题,请参考以下文章
电力负荷预测基于matlab遗传算法优化BP神经网络电力负荷预测含Matlab源码 1524期