迷你超市的优化布局与神经网络模型的建立和运用
刘双庆
([email protected])
摘要 本文分析研究 2008 年北京奥运比赛主场馆的周边地区小型商 亭构建建设,通过预先问卷调查,得出观众(购物主体)的出行和用 餐的需求方式和购物欲望情况,以此作为训练目标。20 个迷你超市,
由它们的人流分布情况,按人流分布百分比设定网络输入矢量。通过 构建含 2 个隐含层的 BP 神经网络,训练出它们的权值,并将权值识 别划分,得出迷你超市与 3 个主场馆的关联程度,以此确定超市的布 局。在以年龄为需求方式和购物欲望情况划分,和以消费水平高低划 分时,分别得到两个划分不同的模型,计算机计算得出两模型相关良 好,因此得出的模型可靠性高。
关键词 超市布局 BP 神经网络 流分布
一 问题重述
2008 年北京奥运比赛主场馆的周边地区小型商亭(迷你超市)
需要临时构建建设,由预先调查观众(购物主体)的出行和用餐的需 求方式和购物欲望情况,以及测算出的相应人流分布,来最优化小型 商亭构建布局问题。
二 问题假设
1 三次预演的运动会的问卷调查认为符合同一统计规律,三次可线性
组合为一次。
2 商业目标以购物主体的需求方式和购物欲望情况为基础,充分将模 型向问卷调查情况分布逼近,则认为可获利益最大。
三 符号说明
byage
表示通过年龄划分得出的参数byconsume
表示通过消费划分得出的参数四 模型的构建
通过问题的分析,我们可以将购物主体的需求方式和购物欲望情 况作为评判标准,将人流量分布作为输入值,进而计算他们的隐射关 系,构成权值分布,这权值分布的实际意义就是各超市与各场馆的相 关关系度。即:
J = W × Q
J 为需求方式和购物欲望情况的归一矩阵, W 为所求权值
( ,以辅助全局),Q 为输入矢量(人流量分布的归一
值)。 图一 体现出 20 个输入与三个场馆的关联。符号
⊗
为网络作用算子。
3 2
1 W W
W
W = ⊗ ⊗
W2 W1 ⊗
图 一 两个隐含层的 BP 神经网络建模
在此采用附加动量法和自适应步长算法的 训练。对于更高精
度的训练,我在附录中编了一个 3 个隐含层的程序( 提供的训
练 为 1-2 个 隐 含 层 )。 激 活 函 数 用 S 型 。 训 练 流 程 如 下 :
matlab
图 二 BP 网络算法框图 五 模型训练
5.1 模型参数提取
5.11 需求方式和购物欲望情况(训练目标)的规律分布
本模型分别以年龄划分和以消费水平划分,将附录表格中的
和 进行了 0-1 刻画,通过累积求和,平均,求对比值:
"
false
“ "true "
age k j = ∑ i age k ( i , j ) 3
) 1 (
)) ( (
) ) (
( Max age j j j age
age
k k
k =
then
age ( j ) = ∑ k age k ( j )
)) ( (
) ) (
( Max age j j j age
age =
( =1,2,3;
i j
=1,2,3…9; =1,2,3,4)k
同理:
consume k j = ∑ i consume k ( i , j ) 3
) 1 (
)) ( (
) ) (
( Max consume j j consume j
consume
k k
k =
then
consume ( j ) = ∑ k consume k ( j )
)) ( (
) ) (
( Max consume j j consume j
consume =
( =1,2,3;
i j
=1,2,3…9; =1,2,3...6)k
得出数据分布:
byage
=[0.3953 0.4635 0.4312 0.2037 0.4207 0.4264 0.6487 1.0000 0.6910];byconsume
=[0.4796 0.3707 0.3614 0.1667 0.3101 0.3216 0.3609 1.0000 0.6469];1 2 3 4 5 6 7 8 9
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
age
consume
图三 按年龄和按消费划分的规律分布 5.12 模型输入向量
由于流分布通过 5.11 的结果和经过测算得出,为具体起见,构 造一个映射图:
图 四 流量相关分析
根据题目说明的,出行均采取最短路径,因此上图中的相关的连线(可 行道路),对于每一个迷你超市来说,并不是所有的都分配到。在计 算相关流量时,亦定义:
M N
k = ×
ζ
其中:
ζ k为第 k 超市分配到的百分总和比,M 为三个主场管某场管
的总人数,N 为调查观众(购物主体)的出行和用餐的需求方式和购 物欲望情况百分率分布。此题先把所有连接进行表格描述,然后通过 人工选择确定归属。其中:
a=4;
b=6;
c=10;
c1=a*(bb(1)+bb(4))+c*bb(1);
c2=a*(bb(1)+bb(4)+bb(3))+b*bb(1)+c*bb(1);
c3=1*(a*(bb(2)+bb(5)+bb(6)+bb(7)+bb(8)+bb(9))+c*bb(1));
c4=1*(a*(bb(2)+bb(4)+bb(5)+bb(6)+bb(7)+bb(8)+bb(9))+c*bb(1));
其中a,b,c(注:a, c因为程序关系,位置与实际数据不对应)
为场管总容纳人数, 为购物主体的兴趣分布,每一项的右项为人
工依据图形和走最短路径原则选择得到。(全列出来在附录上)。 所得数据:
byage
=[0.0157 0.0259 0.0460 0.0480 0.0525 0.0363 0.0460 0.0210 0.0656 0.0656 0.0497 0.0497 0.0497 0.0081 0.0639 0.0993 0.0993 0.0993 0.0081 0.0504];byconsume
=[0.0211 0.0335 0.0481 0.0500 0.0563 0.0398 0.0460 0.0225 0.0679 0.0679 0.0481 0.0481 0.0481 0.0090 0.0560 0.0938 0.0938 0.0938 0.0090 0.0469];图像分布:
0 2 4 6 8 10 12 14 16 18 20
0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1
age
consume
图 五 各超市的人流百分比 5.2 神经网络结构与训练结果
这里采取两个隐含层的神经网络,结构为: 20-8-3-9(参见图一), 20 个输入端,9 个目标函数,当训练结果达到误差目标时,权值分布
就体现了隶属度。通过改进的变步长和加小动量的 函数进行训
练。
trainbpx
对输入和训练目标归一,转到(-1 ,1)的范围。输入归一:
min(aaa);
xaaa2 max(aaa);
xaaa1 = =
2/x;
x xaaa2;
- xaaa1
x = =
xaaa2)/2 (xaaa1
aver = +
aver;
- aaa
aaa =
目标归一:
J = J × 0 . 8
训练的参数设置:
lr=0.5;lr_inc=1.05;lr_dec=0.7;err_ratio=1.04;mom_const=0.9;
结果如下:
0 10 20 30 40 50 60
10-6 10-4 10-2 100
Epoch Su
mSquaedEo-rrrr
Training for 65 Epochs
0 10 20 30 40 50 60 70
0 2 4 6 8
Epoch Le
ar ni ng Rat e
图 六 按年龄划分的网络训练
TRAINBPX: 0/50000 epochs, lr = 0.5, SSE = 0.458372.
TRAINBPX: 65/50000 epochs, lr = 6.2264, SSE = 4.86139e-006.
byage = 0.2027 0.3323 0.4650
0 5 10 15 20 25 30 35 40 45 50 55 10-6
10-4 10-2 100
Epoch Su
m- Squaedr Eorrr
Training for 55 Epochs
0 10 20 30 40 50 60
0 1 2 3 4 5
Epoch Le
ar ni ng Rat e
图 七 按消费划分的网络训练
TRAINBPX: 0/50000 epochs, lr = 0.5, SSE = 0.0830832.
TRAINBPX: 55/50000 epochs, lr = 4.87854, SSE = 9.79024e-006.
consume =0.2166 0.3222 0.4613
1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3
0.2 0.25 0.3 0.35 0.4 0.45 0.5
图 八 按年龄和按消费划分得到的隶属度
对以上
byage
,byconsume
的数据,转换成相应的连接超市的数量。转换公式:
S = 20 × r
; (r
为百分比)ageresult
= 4.0549 6.6451 9.3001ult
consumeres
= 4.3319 6.4431 9.2251 近似值有:ageresult
=4 7 9ult
consumeres
=4 7 9因此从模型解出的结果得到建议:
可适当增加 B 区一个超市,减少 A 区一个超市。
由于超市的大小规模还可以变动,所以可以对训练后得到的权 值的分数部分一起考察,以更好的布局来节约建筑成本和其他相应成 本。引入超市规模:
X
,aX
,a
为两种超市规模的比值,X
是 的 矩阵,1× 20
I
为单位矩阵, 为耦合算子(类似点乘,用于程序编码)∩
。⎪ ⎩
⎪ ⎨
⎧
=
=
=
3001 . 9
6451 . 6
0549 . 4
a IX
a IX
a IX byage
∩
∩
∩
⎪ ⎩
⎪ ⎨
⎧
=
=
=
2251 . 9
4431 . 6
3319 . 4
a IX
a IX
a IX byconsume
∩
∩
∩
它们是欠定方程组,在此我设置一种算法,以求在解空间更快
地找到次优解, 为假定的规模较大的商店的个数。
n
图 九 广泛解空间搜索探讨算法流程
弱连续矩阵修正方案附在附录里。(注:)考虑现实的情况,大 超市组合效应好,浪费低,并且已求模型的建议是可适当增加 B 区 一个超市,减少 A 区一个超市,所以:
取 =2(体现在编码中),可提议:
a
age: C: 1 1 2 B: 2 1 1 1 2 A: 2 1 1 2 1 2 consume: C: 1 1 2 B: 1 2 1 1 2 A: 2 1 2 1 1 2
其中 A,B,C 代表场馆,后面的数据的列数代表它分得的商店个数,2,
1 分别代表大小市场。
六 模型检验
本文分别用按年龄和按消费两个途径进行建模求解,始终是独立 的。从图八可以明显地看到两种途径训练得到的结果是很接近于一起 的。这可以说明,对不同因素的最终反映(该因素现实中反映的结果
也不会相差太远),模型收敛良好。这说明用此模型和方法是正确的。
七 模型推广
此类模型一般都是只知道输入端的情况和输出端的情况,中间过 程像黑箱效应一样。用权值训练,最后得到隐射关系。只要训练的重 复结果比重较大,则认为该训练得到的权值是该输入和输出的良好隐 射。
因此此类算法可以运用:
1 空间场能量分布,边坡应力分析等。
2 可以用于预测,一旦训练好权值,那系统的主要关系函数就会包 含于权值矩阵中。用未来的输入矢量运行,则可以得到未来可能出现 的观测值。
[注]1 弱连续矩阵指归化矩阵后以 0.1 为起始,0.9 为间隔步长的数 据组成的矩阵。如 x=[0.1 1.8 0.9]。从而使解空间在
3 20
个排列中优化。2 依次最大指第一个最大值,第二个最大值,第三个…。
参考文献
1 丛爽 《
matlab
神经网络工具箱的运用》 中国科技大学出版社 2002 2 陈志军 《灌溉发展需求预测人工神经网络模型的建立与应用》1998 年 2 月《水利学报》
3 陆伟民 《人工智能技术及运用》同济大学出版社 1998.4 附 录
%%%%%%===原始数据处理得到的数据=======%%%%%%%%
图 十 原始数据整理流程 clc;
%---age---
xa=[95 58 60 41 67 62 39 181 162 94 48 62 36 70 67 40 177 160
99 53 74 36 80 73 44 194 177];
xb=[359 290 400 184 388 408 323 1258 448
316 263 350 174 360 358 297 1121 403 380 355 434 210 467 454 372 1430 498];
xc=[92 140 153 64 134 128 269 294 148 85 148 121 56 119 124 246 278 129
xd=[66 111 68 19 56 59 152 104 122 43 99 62 28 56 61 141 96 112
55 99 73 34 71 78 167 112 131];
ta=mean(xa);tb=mean(xb);tc=mean(xc);td=mean(xd);
ta=ta/max(ta);tb=tb/max(tb);tc=tc/max(tc);td=td/max(td);
tt=ta+tb+tc+td;
tt=tt/max(tt);
figure;
plot(tt,'b');
gtext('age');
aa=tt; %-
%---consume---
xa=[104 125 125 58 121 150 190 310 183 100 105 117 61 129 117 135 302 192
110 116 132 65 166 159 194 328 226];
xb=[144 147 170 72 155 146 206 405 222 120 166 143 61 166 160 232 384 200 144 179 172 97 183 205 265 484 231];
xc=[268 251 311 138 315 307 323 905 362 234 223 253 140 265 277 313 777 302 271 281 316 146 340 332 347 957 382];
xd=[63 57 61 37 47 48 57 183 73
48 47 69 25 37 43 38 166 65 65 77 104 43 58 54 63 247 91];
xe=[18 14 7 2 5 2 3 23 21 22 13 9 3 5 8 4 34 22 19 11 7 1 7 5 6 27 17];
xf=[15 5 7 1 2 4 4 11 19 14 4 4 4 3 5 4 11 19 15 8 4 4 2 2 0 15 20];
ta=mean(xa);tb=mean(xb);tc=mean(xc);td=mean(xd);te=mean(xe);tf=me an(xf);
ta=ta/max(ta);tb=tb/max(tb);tc=tc/max(tc);td=td/max(td);te=te/max(te);tf
=tf/max(tf);
tt=ta+tb+tc+td+te+tf;
tt=tt/max(tt);
hold on plot(tt,'r');
gtext('consume');
bb=tt;
aa %----age---
bb %----consume----
%%%%%=====人流量的测算及程序======%%%%%%%%%%
clc;
%---
aa =[0.3953 0.4635 0.4312 0.2037 0.4207 0.4264 0.6487 1.0000 0.6910];
bb =[0.4796 0.3707 0.3614 0.1667 0.3101 0.3216 0.3609 1.0000 0.6469];
%--- a=4;
b=6;
c=10;
c1=a*(aa(1)+aa(4))+c*aa(1);
c2=a*(aa(1)+aa(4)+aa(3))+b*aa(1)+c*aa(1);
c3=a*(aa(2)+aa(5)+aa(6)+aa(7)+aa(8)+aa(9))+c*aa(1);
c4=a*(aa(2)+aa(4)+aa(5)+aa(6)+aa(7)+aa(8)+aa(9))+c*aa(1);
%---
b1=a*(aa(6)+aa(8)+aa(9))+b*(aa(6)+aa(8)+aa(9));
b2=a*(aa(9)+aa(8)+aa(6))+b*(aa(1)+aa(4)+aa(3));
b3=a*(aa(6)+aa(9)+aa(8))+b*(aa(3)+aa(7)+aa(1)+aa(4));
b4=a*(aa(6)+aa(9)+aa(8));
b5=a*(aa(6)+aa(9)+aa(8))+b*(aa(6)+aa(8)+aa(9)+aa(2)+aa(5));
b6=a*(aa(6)+aa(9)+aa(8))+b*(aa(2)+aa(5)+aa(6)+aa(8)+aa(9));
%---
a1=a*(aa(1)+aa(5))+c*(aa(1)+aa(4)+aa(7)+aa(3));
a2=a*(aa(1)+aa(5))+c*(aa(1)+aa(4)+aa(7)+aa(3));
a3=a*(aa(1)+aa(5))+c*(aa(1)+aa(4)+aa(7)+aa(3));
a4=a*(aa(1)+aa(5));
a5=a*(aa(2)+aa(5))+c*(aa(2)+aa(5)+aa(7)+aa(9));
a6=a*(aa(2)+aa(5))+c*(aa(2)+aa(5)+aa(7)+aa(9)+aa(6)+aa(8));
a7=a*(aa(2)+aa(5))+c*(aa(2)+aa(5)+aa(7)+aa(9)+aa(6)+aa(8));
a8=a*(aa(2)+aa(5))+c*(aa(2)+aa(5)+aa(7)+aa(9)+aa(6)+aa(8));
a9=a*(aa(1)+aa(5));
a10=a*(aa(2)+aa(5))+c*(aa(1)+aa(3)+aa(4)+aa(7));
%---
aaa=[c1 c2 c3 c4 b1 b2 b3 b4 b5 b6 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10];
sum=0;
for i=1:20;
sum=sum+aaa(i);
end
aaa=aaa/sum;
plot(aaa,'b');
gtext('age');
%---
bb =[0.4796 0.3707 0.3614 0.1667 0.3101 0.3216 0.3609 1.0000 0.6469];
%---
a=4;
b=6;
c=10;
c1=a*(bb(1)+bb(4))+c*bb(1);
c2=a*(bb(1)+bb(4)+bb(3))+b*bb(1)+c*bb(1);
c3=1*(a*(bb(2)+bb(5)+bb(6)+bb(7)+bb(8)+bb(9))+c*bb(1));
c4=1*(a*(bb(2)+bb(4)+bb(5)+bb(6)+bb(7)+bb(8)+bb(9))+c*bb(1));
%---
b1=a*(bb(6)+bb(8)+bb(9))+b*(bb(6)+bb(8)+bb(9));
b2=a*(bb(9)+bb(8)+bb(6))+b*(bb(1)+bb(4)+bb(3));
b3=a*(bb(6)+bb(9)+bb(8))+b*(bb(3)+bb(7)+bb(1)+bb(4));
b4=a*(bb(6)+bb(9)+bb(8));
b5=a*(bb(6)+bb(9)+bb(8))+b*(bb(6)+bb(8)+bb(9)+bb(2)+bb(5));
b6=a*(bb(6)+bb(9)+bb(8))+b*(bb(2)+bb(5)+bb(6)+bb(8)+bb(9));
%---
a1=1*(a*(bb(1)+bb(5))+c*(bb(1)+bb(4)+bb(7)+bb(3)));
a2=a*(bb(1)+bb(5))+c*(bb(1)+bb(4)+bb(7)+bb(3));
a3=a*(bb(1)+bb(5))+c*(bb(1)+bb(4)+bb(7)+bb(3));
a4=a*(bb(1)+bb(5));
a5=a*(bb(2)+bb(5))+c*(bb(2)+bb(5)+bb(7)+bb(9));
a6=a*(bb(2)+bb(5))+c*(bb(2)+bb(5)+bb(7)+bb(9)+bb(6)+bb(8));
a7=a*(bb(2)+bb(5))+c*(bb(2)+bb(5)+bb(7)+bb(9)+bb(6)+bb(8));
a8=a*(bb(2)+bb(5))+c*(bb(2)+bb(5)+bb(7)+bb(9)+bb(6)+bb(8));
a9=a*(bb(1)+bb(5));
a10=a*(bb(2)+bb(5))+c*(bb(1)+bb(3)+bb(4)+bb(7));
%---
bbb=[c1 c2 c3 c4 b1 b2 b3 b4 b5 b6 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10];
sum=0;
for i=1:20;
sum=sum+bbb(i);
end
bbb=bbb/sum;
hold on plot(bbb,'r');
gtext('consume');
aaa,bbb
%%%%=====trainbpx 网络训练程序和图八程序====%%%%%
%--- clc;
nntwarn off clear;
%---
aaa =[0.0157 0.0259 0.0460 0.0480 0.0525 0.0363 0.0460 0.0210 0.0656 0.0656 0.0497 0.0497
0.0497 0.0081 0.0639 0.0993 0.0993 0.0993 0.0081 0.0504];
aa =[0.3953 0.4635 0.4312 0.2037 0.4207 0.4264 0.6487 1.0000 0.6910];
xaaa1=max(aaa);xaaa2=min(aaa);
x=xaaa1-xaaa2;x=2/x;
aver=(xaaa1+xaaa2)/2;
aaa=aaa-aver;
aaa=aaa*x;
aaa=aaa';
%--- aa=0.8*aa;
aa=aa';
%--- disp_freq=400;
max_epoch=50000;
err_goal=0.00001;
lr=0.5;
lr_inc=1.05;
lr_dec=0.7;
err_ratio=1.04;
mom_const=0.9;
TP=[disp_freq max_epoch err_goal lr lr_inc lr_dec mom_const err_ratio];
%--- [R,Q]=size(aaa);[s3,Q]=size(aa);
s1=8;s2=3;
[W1,B1]=nwtan(s1,R);
[W2,B2]=nwtan(s2,s1);
[W3,B3]=nwtan(s3,s2);
W1=0.5*W1;B1=0.5*B1;
W2=0.5*W2;B2=0.5*B2;
W3=0.5*W3;B3=0.5*B3;
[W1,B1,W2,B2,W3,B3,epochs,errors]=trainbpx(W1,B1,'logsig',W2,B2,'l ogsig',W3,B3,'logsig',aaa,aa,TP);
ttt=logsig(W2*logsig(W1*aaa,B1),B2);
ttt=ttt/sum(ttt);
%plot(ttt,'b');
figure;
%===================================
bbb =[0.0211 0.0335 0.0481 0.0500 0.0563 0.0398 0.0460 0.0225 0.0679 0.0679 0.0481 0.0481 0.0481 0.0090 0.0560 0.0938 0.0938 0.0938 0.0090 0.0469];
aaa =bbb;%---从 bbb 转得到---
bb =[0.4796 0.3707 0.3614 0.1667 0.3101 0.3216 0.3609 1.0000 0.6469];
aa =bb;%---从 bb 转得到--- xaaa1=max(aaa);xaaa2=min(aaa);
x=xaaa1-xaaa2;x=2/x;
aver=(xaaa1+xaaa2)/2;
aaa=aaa-aver;
aaa=aaa*x;
aaa=aaa';
%--- aa=0.8*aa;
aa=aa';
%--- disp_freq=400;
max_epoch=50000;
err_goal=0.00001;
lr=0.5;
lr_inc=1.05;
lr_dec=0.7;
err_ratio=1.04;
mom_const=0.9;
TP=[disp_freq max_epoch err_goal lr lr_inc lr_dec mom_const err_ratio];
%--- [R,Q]=size(aaa);[s3,Q]=size(aa);
s1=8;s2=3;
%[W1,B1]=nwtan(s1,R);
%[W2,B2]=nwtan(s2,s1);
%[W3,B3]=nwtan(s3,s2);
%W1=0.5*W1;B1=0.5*B1;
%W2=0.5*W2;B2=0.5*B2;
%W3=0.5*W3;B3=0.5*B3;
[W1,B1,W2,B2,W3,B3,epochs,errors]=trainbpx(W1,B1,'logsig',W2,B2,'l ogsig',W3,B3,'logsig',aaa,aa,TP);
tttt=logsig(W2*logsig(W1*aaa,B1),B2);
tttt=tttt/sum(tttt);
figure;
plot(ttt,'r');hold on plot(tttt);
%%%%%%%=======超市分布数量求取=======%%%%%%%%
age=20*ttt/sum(ttt)
age = 4.0549 6.6451 9.3001 consume=20*tttt/sum(tttt)
consume = 4.3319 6.4431 9.2251
%%%%%%%%%%%%%%%%%%=========%%%%%%%%%
图十一 弱连续矩阵修正方案(t1,t2 为设定的常量)(only reference)
%%%%%%=====3 个隐含层网络训练程序=======%%%%%%
%--- function
[w1,b1,w2,b2,w3,b3,w4,b4,i,tr]=tbpx333(w1,b1,f1,w2,b2,f2,w3,b3,f3,w4 ,b4,f4,p,t,tp)
%TBPX3 Train 3-layer feed-forward network w/fast backpropagation.
%
% This function is obselete.
% Use NNT2FF and TRAIN to update and train your network.
% [W1,B1,W2,B2,W3,B3,TE,TR] =
TBPX3(W1,B2,F1,W1,B1,F2,W3,B3,F3,P,T,TP)
% Wi - Weight matrix for the ith layer.
% Bi - Bias vector for the ith layer.
% P - RxQ matrix of input vectors.
% T - SxQ matrix of target vectors.
% TP - Training parameters (optional).
% Returns:
% Wi - new weights.
% Bi - new biases.
% TE - the actual number of epochs trained.
% TR - training record: [row of errors]
%
% Training parameters are:
% TP(1) - Epochs between updating display, default = 25.
% TP(2) - Maximum number of epochs to train, default = 1000.
% TP(3) - Sum-squared error goal, default = 0.02.
% TP(4) - Learning rate, 0.01.
% TP(5) - Learning rate increase, default = 1.05.
% TP(6) - Learning rate decrease, default = 0.7.
% TP(7) - Momentum constant, default = 0.9.
% TP(8) - Maximum error ratio, default = 1.04.
% Missing parameters and NaN's are replaced with defaults.
if nargin < 11,error('Not enough arguments.');end
% TRAINING PARAMETERS if nargin == 11, tp = []; end
tp = nndef(tp,[25 1000 0.02 0.01 1.05 0.7 0.9 1.04]);
df = tp(1);
me = tp(2);
eg = tp(3);
lr = tp(4);
im = tp(5);
dm = tp(6);
mc = tp(7);
er = tp(8);
df1 = feval(f1,'delta');
df2 = feval(f2,'delta');
df3 = feval(f3,'delta');
df4 = feval(f4,'delta');
dw1 = w1*0;
db1 = b1*0;
dw2 = w2*0;
db2 = b2*0;
dw3 = w3*0;
db3 = b3*0;
dw4 = w3*0;
db4 = b4*0;
MC = 0;
% PRESENTATION PHASE a1 = feval(f1,w1*p,b1);
a2 = feval(f2,w2*a1,b2);
a3 = feval(f3,w3*a2,b3);
a4 = feval(f4,w4*a3,b4);
e = t-a4;
SSE = sumsqr(e);
% TRAINING RECORD tr = zeros(2,me+1);
tr(1:2,1) = [SSE; lr];
% PLOTTING FLAG [r,q] = size(p);
[s,q] = size(t);
plottype = (max(r,s) == 1) & 0;
% PLOTTING
newplot;
message = sprintf('TRAINBPX: %%g/%g epochs, lr = %%g, SSE =
%%g.\n',me);
fprintf(message,0,lr,SSE) if plottype
h = plotfa(p,t,p,a4);
else
h = plottr(tr(1:2,1),eg);
end
% BACKPROPAGATION PHASE d4 = feval(df4,a4,e);
d3 = feval(df3,a3,d4,w4);
d2 = feval(df2,a2,d3,w3);
d1 = feval(df1,a1,d2,w2);
for i=1:me
% CHECK PHASE
if SSE < eg, i=i-1; break, end
% LEARNING PHASE
[dw1,db1] = learnbpm(p,d1,lr,MC,dw1,db1);
[dw2,db2] = learnbpm(a1,d2,lr,MC,dw2,db2);
[dw3,db3] = learnbpm(a2,d3,lr,MC,dw3,db3);
[dw4,db4] = learnbpm(a3,d4,lr,MC,dw4,db4);
MC = mc;
new_w1 = w1 + dw1; new_b1 = b1 + db1;
new_w2 = w2 + dw2; new_b2 = b2 + db2;
new_w3 = w3 + dw3; new_b3 = b3 + db3;
new_w4 = w4 + dw4; new_b4 = b4 + db4;
% PRESENTATION PHASE
new_a1 = feval(f1,new_w1*p,new_b1);
new_a2 = feval(f2,new_w2*new_a1,new_b2);
new_a3 = feval(f3,new_w3*new_a2,new_b3);
new_a4 = feval(f4,new_w4*new_a3,new_b4);
new_e = t-new_a4;
new_SSE = sumsqr(new_e);
% MOMENTUM & ADAPTIVE LEARNING RATE PHASE if new_SSE > SSE*er
lr = lr * dm;
MC = 0;
else
if new_SSE < SSE lr = lr * im;
end
w1 = new_w1; b1 = new_b1; a1 = new_a1;
w2 = new_w2; b2 = new_b2; a2 = new_a2;
w3 = new_w3; b3 = new_b3; a3 = new_a3;
w4 = new_w4; b4 = new_b4; a4 = new_a4;
e = new_e; SSE = new_SSE;
% BACKPROPAGATION PHASE d4 = feval(df4,a4,e);
d3 = feval(df3,a3,d4,w4);
d2 = feval(df2,a2,d3,w3);
d1 = feval(df1,a1,d2,w2);
end
% TRAINING RECORD tr(1:2,i+1) = [SSE; lr];
% PLOTTING if rem(i,df) == 0
fprintf(message,i,lr,SSE) if plottype
delete(h);
h = plot(p,a4);
else
h = plottr(tr(1:2,1:(i+1)),eg,h);
end end end
% TRAINING RECORD tr = tr(1:2,1:(i+1));
% PLOTTING if rem(i,df) ~= 0
fprintf(message,i,lr,SSE) if plottype
delete(h);
plot(p,a4);
else
plottr(tr,eg,h);
end end
% WARNINGS if SSE > eg disp(' ')
disp('TRAINBPX: Network error did not reach the error goal.') disp(' Further training may be necessary, or try different') disp(' initial weights and biases and/or more hidden neurons.') disp(' ')
end