|
非凸优化问题,不同的初始搜索点可能导致不同的最优化结果,为此,引入遗传,粒子群,蚁群算法,模拟退火,见matlab全局优化工具箱。
遗传算法的基本思想是,在计算机上模拟生命进化机制而发展起来的一类新的最优化算法,一组初始值(种群)开始搜索,个体染色体,交叉变异,适者生存,进化出下一代,若干代后得到较优的解。
早期有名的是英国Sheffield大学和美国北卡罗拉纳州立大学开发的遗传算法工具箱GAOT。
具体遗传算法的基本原理,请参考:链接:https://pan.baidu.com/s/1gBOXi8C2cY807kj7HtIJPw?pwd=dp8g
提取码:dp8g
现在matlab内置了遗传算法工具箱函数ga().
为了测试算法性能好坏,有很多常用的测试函数。
一、一些测试函数
Rastrigin多峰函数:
每种算法运行100次,观察全局最优解成功率,耗时。
f =@(x)20+(x(1)/30-1)^2+(x(2)/20-1)^2-10*(cos(2*pi*(x(1)/30-1))+cos(2*pi*(x(2)/20-1)))
% 目标函数
A=[];B=[];Aeq=[];Beq=[];xm=-100*ones(2,1);xM=-xm;
F1=[];F2=[];F3=[];F4=[];
tic
for i=1:100 ,x0=100*rand(2,1);
%运行各种求解函数
%[x,f0]=ga(f,2,A,B,Aeq,Beq,xm,xM);F1=[F1;x,f0];
% [x,f0]=patternsearch(f,x0,A,B,Aeq,Beq,xm,xM);F2=[F2;x',f0]; %模式搜索算法
[x,f0]=particleswarm(f,2,xm,xM);F3=[F3;x,f0]; %粒子群算法
%[x,f0]=simulannealbnd(f,x0,xm,xM);F4=[F4;x',f0]; %模拟退火算法
end
toc
%i1=length(find(F1(:,3)<1e-5))
%i2=length(find(F2(:,3)<1e-5))
i3=length(find(F3(:,3)<1e-5))
%i4=length(find(F4(:,3)<1e-5))
历时 2.613878 秒。
i3 =
91
Griewangk基准函数
n=50; %50个决策变量
f=@(x) 1+sum(x.^2/4000)-prod(cos(x(:)./[1:n]&#39;));
A=[];B=[];Aeq=[];Beq=[];xm=-600*ones(n,1);xM=-xm;
F1=[];F2=[];F3=[];F4=[];
tic
for i =1:100,x0=600*rand(n,1)
%[x,f0]=ga(f,n,A,B,Aeq,Beq,xm,xM);F1=[F1;f0];
% [x,f0]=patternsearch(f,x0,A,B,Aeq,Beq,xm,xM);F2=[F2;f0];
[x,f0]=particleswarm(f,n,xm,xM);F3=[F3;f0];
%[x,f0]=simulannealbnd(f,x0,xm,xM);F4=[F4;f0];
end
toc
% 最优解为全0
max(F4), max(F3)
x0 = 50×1
102 ×
5.547331193932800 5.546182297849493 1.649474442043273 2.105319982951498 1.815931194221220 5.366023347889880 0.817771290062103 1.435676993119801 5.094395427436423 5.590798241034586 ....
toc
历时 41.009270 秒。
% 最优解为全0
max(F4), max(F3)
ans = [ ]
ans = 0.794034887857747
二、复杂的非线性规划求解
非线性约束条件:
function [c,ceq]=c5mcpl(x)
ceq=[];
A1=sqrt((745*x(4)/x(2)/x(3))^2+16.91e6); B1=0.1*x(6)^3;
A2=sqrt((745*x(5)/x(2)/x(3))^2+157.5e6); B2=0.1*x(7)^3;
c=[-x(1)*x(2)^2*x(3)+27; -x(1)*x(2)^2*x(3)^2+397.5;
-x(2)*x(6)^4*x(3)/x(4)^3+1.93; A1/B1-1100;
-x(2)*x(7)^4*x(3)/x(5)^3+1.93; A2/B2-850;
x(2)*x(3)-40; -x(1)/x(2)+5; x(1)/x(2)-12;
1.5*x(6)+1.9-x(4); 1.1*x(7)+1.9-x(5)];目标函数:
A=[];B=[];Aeq=[];Beq=[];
f=@(x)0.7854*x(1)*x(2)^2*(3.3333*x(3)^2+14.9334*x(3)-43.0934)-1.508*x(1)*(x(6)^2+x(7)^2)+7.477*(x(6)^3+x(7)^3)+0.7854*(x(4)*x(6)^2+x(5)*x(7)^2);
xm=[2.6,0.7,17,7.3,7.3,2.9,5];
xM=[3.6,0.8,28,8.3,8.3,3.9,5.5];
[x,f0]=fmincon(f,rand(7,1),A,B,Aeq,Beq,xm,xM,@c5mcpl)
%遗传算法
xx=[]
for i=1:7
tic
[x,x0,flag]=ga(f,7,A,B,Aeq,Beq,xm,xM,@c5mcpl)
toc
if flag==1
xx=[xx;x f0];
end
endx =
3.500000006636445 0.700000000308885 17.000000011596669 7.300000215221772 7.715320005042021 3.350540957339616 5.286654468041168 ....
f0 =
2.994424479756736e+03
x =
3.499302564458190 0.700000000000000 17.000015701674656 7.300039720659272 7.714365598727852 3.350550631870008 5.286672859785385 ...
x0 =
2.994146799506752e+03
flag =
1
历时 12.028220 秒。
三、神经网络拟合
神经网络分类器
做一个简单的评三好生的神经网络模型,假如如果手头上有一些三好生和非三好生的成绩数据,我们可 以把这些样本“喂”给模型,经过一段时间后,网络就可以学习到三个权 值参数的信息。下一步我们就可以用这个学到的网络来评判是否三好生。
上述单个神经元就是一个简单的二分类器,复杂的多层神经网络具有更强大的能力。
下面是一个神经网络拟合问题,有一个通用逼近定理,任何非线性函数都可以用一个神经网络来拟合!
x = 0:0.05:10;
y=0.12*exp(-0.213*x)+0.54*exp(-0.17*x).*sin(1.23*x);
net=fitnet(5);
net.trainParam.epochs=1000;
[net,b]=train(net,x,y);
plotperform(b)
x0=[0:0.1:10];
y0=0.12*exp(-0.213*x0)+0.54*exp(-0.17*x0).*sin(1.23*x0);
y1=net(x0)
plot(x,y,&#39;o&#39;,x0,y0,x0,y1,&#39;:&#39;);
再一个例子
clc
clear
close
x = [0 1 2 3 4 5 6 7 8]; % 样本属性值
t = [0 0.84 0.91 0.14 -0.77 -0.96 -0.28 0.66 0.99]; %样本的目标标签值
net = feedforwardnet(10); %定义神经网络一层隐含层,且神经元数量为10个
net = configure(net,x,t); %利用构建的网络,对网络各参数进行初始化赋值,形成初始网络
y1 = net(x); %初始网络对输入进行计算后的输出
net = train(net,x,t); %对国建的神经网络进行训练,输出训练完成的网络
y2 = net(x); %训练完成后的网络对输入进行计算后的输出
plot(x,t,&#39;o&#39;,x,y1,&#39;^&#39;,x,y2,&#39;*&#39;) %对三者数据进行绘图
legend(&#39;原始数据值&#39;,&#39;初始网络预测值&#39;,&#39;训练后网络预测值&#39;)
再来一个例子:
基于BP网络的性别识别.以年级中男生女生的身高、体重为输入,经过一定数量的样本训练后,可以较好地识别出新样本的性别,其中男生172人,女生88人.具体数据见Excel文件(链接:https://pan.baidu.com/s/1ymdiklg96oqjv1VTbXN7CA?pwd=53m7
提取码:53m7)
MATLAB程序如下(Annfeedforwardne.m文件):
% 使用feedforwardnet函数实现性别识别
% 清理
clear,%clc
rng(2)
% 读入数据
xlsfile=&#39;student.xls&#39;;
[data,label]=getdata(xlsfile);
% 划分数据
[traind,trainl,testd,testl]=divide(data,label);
% 创建网络
net=feedforwardnet(10);
net = configure(net,traind&#39;,trainl); %配置内存
%%对网络进行训练
net.trainParam.epochs = 50;%执行步长为100
net.trainFcn=&#39;trainbfg&#39;; %net.trainFcn=&#39;trainlm&#39;;
% 训练网络
net=train(net,traind&#39;,trainl);
%显示相关参数
disp(&#39;网络训练后的第一层权值为:&#39;)
w1=net.iw{1}
disp(&#39;网络训练后的第一层阈值:&#39;)
b1=net.b{1}
disp(&#39;网络训练后的第二层权值为:&#39;)
w2=net.Lw{2}
disp(&#39;网络训练后的第二层阈值:&#39;)
b2=net.b{2}
% 测试
test_out=sim(net,testd&#39;);
test_out(test_out>=0.5)=1;
test_out(test_out<0.5)=0;
rate=sum(test_out==testl)/length(testl);
fprintf(&#39;正确率为:\n %f \n&#39;, rate*100);
% 显示训练样本
train_m = traind(trainl==1,:); train_m=train_m&#39;;
train_f = traind(trainl==0,:); train_f=train_f&#39;;
plot(train_m(1,:),train_m(2,:),&#39;bo&#39;); hold on;
plot(train_f(1,:),train_f(2,:),&#39;r*&#39;);
xlabel(&#39;身高&#39;); ylabel(&#39;体重&#39;)
title(&#39;训练样本分布&#39;); legend(&#39;男生&#39;,&#39;女生&#39;);
上述的程序调用了两个子函数getdata.m和divide.m,代码分别如下
function [data,label]=getdata(xlsfile)
% [data,label]=getdata(&#39;student.xls&#39;)
[~,label]=xlsread(xlsfile,1,&#39;B2:B261&#39;);
[height,~]=xlsread(xlsfile,&#39;C2:C261&#39;);
[weight,~]=xlsread(xlsfile,&#39;D2:D261&#39;);
data=[height,weight];
la=zeros(size(label));
for i=1:length(la)
if (label{i}== &#39;男&#39;), la(i)=1; end
end
label=la;
divide函数用来切分数据集
function [traind,trainl,testd,testl]=divide(data,label)
%[data,label]=getdata(&#39;student.xls&#39;)
% 由于男女数量不平衡, 各取50个进行训练
train_m=50;
train_f=50;
% 男女分开
m_data=data(label==1,:);
f_data=data(label==0,:);
%男生
num_m=length(m_data); % 男生的个数
r=randperm(num_m); %随机重排,将次序打乱
traind(1:train_m,:)=m_data(r(1:train_m),:); %取重排后的前50个数据作为训练集
testd(1:num_m-train_m,:)= m_data(r(train_m+1:num_m),:); %剩下的作为测试集
%女生
num_f=length(f_data); % 女生的个数
r=randperm(num_f); %随机重排,将次序打乱
traind(train_m+1:train_m+train_f,:)=f_data(r(1:train_f),:); %取重排后的前50个数据作为训练集
testd(num_m-train_m+1:num_m-train_m+num_f-train_f,:)=f_data(r(train_f+1:num_f),:); %剩下的作为测试集
% 赋值
trainl=zeros(1,train_m+train_f);
trainl(1:train_m)=1; %训练集男生标签
testl=zeros(1,num_m+num_f-train_m-train_f);
testl(1:num_m-train_m)=1; %测试集男生标签
在命令窗口运行主程序Annfeedforwardne.m,得到如下结果:网络训练后的第一层权值为:
网络训练后的第一层权值为:
w1 = 1.44384888928607 -4.18480952233056
-4.33919912055087 0.632849922164154
2.56917426428233 -3.6616977002294
-4.37558716146066 0.154215752790577
-4.14674567916552 1.47049114306135
2.38084918313696 3.72395757368039
3.87011928395929 -2.00542980488546
3.10704311155857 3.13142109567917
1.24557237983525 4.16342141795573
-0.312953669730938 4.39953644030905
网络训练后的第一层阈值:
b1 = -4.42690688218674
3.50023161084736
-2.38057299939936
1.57200608238244
0.436599110305998
0.488400223473961
1.73291164233109
2.49821971654938
3.54323725248674
-4.44494054118496
网络训练后的第二层权值为:
w2 =
列 1 至 2
0.47286420806718 0.213000940379026
列 3 至 4
0.874887831457051 0.328594076460372
列 5 至 6
0.0788161552387914 0.737741580290311
列 7 至 8
-0.586672749039528 0.742739660738542
列 9 至 10
0.0121736093785839 -0.553913077494564网络训练后的第二层阈值:
b2 =
0.695861355403992正确率为:
93.125000
训练样本分布图
四、google神经网络在线测试平台演示
PlayGround 是一个在线演示、实验的神经网络平台,是一个入门神经 网络非常直观的网站。这个图形化平台非常强大,将神经网络的训练过程 直接可视化。网址是:http://playground.tensorflow.org/。 PlayGround 页面如图所示,主要分为 DATA(数据),FEATURES(特征), HIDDEN LAYERS(隐含层),OUTPUT(输出层)
图中点被标记为两种颜色,深色为正(电脑屏幕颜色为蓝色),浅色为负 (电脑屏幕颜色为黄色),表示要区分的两类数据。 上图我们选了最复杂的螺旋型数据来分类,输入为待分类点的横,纵 坐标两个特征,隐藏层有两个,层之间的连线颜色代表权重正负,层与层 之间的连线粗细表示权重的绝对值大小,训练开始后,我们可以把鼠标放 在线上查看权值,也可以点击修改
我们设置,两个隐藏层,用 sigmoid 激活函数,训练的批大 小为 10,学习率为 0.01,在训练集上的损失是 0.363,在测试集上的损失为 0.468,我们可以调整特征的个数,迭代次数、学习速率、激活函数、隐藏 层数和隐藏节点的个数等超参数,动态地观察分类效果。PlayGround 还提 供了非常灵活的数据配置,可以调节噪声、训练数据和测试数据的比例和 Batch size 的大小。 一般来讲,隐含层越多,衍生出的特征类型也就越丰富,对于分类的 效果也会越好,但不是越多越好,层数多了训练的速度会变慢,同时收敛 的效果不一定会更好,层数和特征的个数太多,会造成训练越困难。
练习:
1、假设某最小化问题的目标函数为(非线性规划问题):
相应的约束条件为:
目标函数
f=@(x)0.7854*x(1)*x(2)^2*(3.3333*x(3)^2+14.9334*x(3)-43.0934) ...
-1.508*x(1)*(x(6)^2+x(7)^2)+7.477*(x(6)^3+x(7)^3)...
+0.7854*(x(4)*x(6)^2+x(5)*x(7)^2); 约束
function [c,ceq]=c5mcpl(x)
ceq=[]; %没有等式约束,故返回空矩阵
A1=sqrt((745*x(4)/x(2)/x(3))^2+16.91e6); B1=0.1*x(6)^3;
A2=sqrt((745*x(5)/x(2)/x(3))^2+157.5e6); B2=0.1*x(7)^3;
c=[-x(1)*x(2)^2*x(3)+27; -x(1)*x(2)^2*x(3)^2+397.5;
-x(2)*x(6)^4*x(3)/x(4)^3+1.93; A1/B1-1100;
-x(2)*x(7)^4*x(3)/x(5)^3+1.93; A2/B2-850;
x(2)*x(3)-40; -x(1)/x(2)+5; x(1)/x(2)-12;
1.5*x(6)+1.9-x(4); 1.1*x(7)+1.9-x(5)];直接优化求解:
A=[];B=[];Aeq=[];Beq=[];
xm=[2.6,0.7,17,7.3,2.9,5];%下界
xM=[3.6,0.8,28,8.3,8.3,3.9,5.5]; %上界
[x,f0]=fmincon(f,rand(7,1),A,B,Aeq,Beq,xm,xM,@c5mcpl)结果大约为2994.
采用遗传算法求解
f=@(x)0.7854*x(1)*x(2)^2*(3.3333*x(3)^2+14.9334*x(3)-43.0934)...
-1.508*x(1)*(x(6)^2+x(7)^2)+7.477*(x(6)^3+x(7)^3)...
+0.7854*(x(4)*x(6)^2+x(5)*x(7)^2);继续
A=[];B=[];Aeq=[];Beq=[];xx=[];
xm=[2.6,0.7,17,7.3,2.9,5];%下界
xM=[3.6,0.8,28,8.3,8.3,3.9,5.5]; %上界
for i =1:7
tic ,[x,f0,flag] =ga(f,7,A,B,Aeq,Beq,xm,xM,@c5mcpl),toc
if flag == 1 ,xx=[xx;x f0]; end
end
参考文献:
1、薛定宇,《MATLAB最优化计算》,清华大学出版社,2020年1月。
2、刘鹏,程显毅,李纪聪,周世祥,《人工智能概论》,清华大学出版社出版时间:2021年7月。
3、马昌凤,柯艺芬,谢亚君 著,《机器学习算法(MATLAB版)》, 科学出版社,2021年6月。
matlab机器学习参考 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|