5.5 试编程实现标准BP算法和累积BP算法,在西瓜数据集3.0上分别用这两个算法训练一个单隐层网络,并进行比较。
给定训练集D={(x1,y1),(x2,y2),......,(xm,ym)},其中输入示例由d个属性描述,输出l为实质向量。
图中拥有d个输入神经元、l个输出神经元、q个隐层神经元的多层前馈网络结构。
θj:表示输出层第j个神经元的阈值。
γh:表示隐层第h个神经元的阈值。
Vih:输入层第i个神经元与隐层第h个神经元直接的连接权值。
Whj:隐层第h个神经元与输出层第j个神经元之间的连接权值。
BP算法每次迭代都计算一个样本,最小化该样本输出值与真实值的差距,然后将修改过的参数传给下一个样本,直到达到收敛条件。这样做参数更新频繁,也可能出现参数更改相互抵消的情况,于是有了累积误差逆传播算法(ABP)。
ABP算法每次迭代都会先算出所有样本的输出,然后最小化整个样本输出与真实值的最小平方和,修改参数后进行下一次迭代。ABP参数更新次数比BP算法少的多,但是当累积误差降到一定程度时,进一步下降会非常缓慢。
迭代终止的条件:这里设置的终止条件是相邻一百次迭代的均方误差的差值不超过0.0001。
BP算法MATLAB语言:
clear
x = xlsread('E:\machine_learning\BP\watermelon3.0.xlsx', 'Sheet1', 'A1:Q8');
y = xlsread('E:\machine_learning\BP\watermelon3.0.xlsx', 'Sheet1', 'A9:Q9');
x=x'; %x进行转置
y=y'; %y进行转置
%将y设置为0,1两类
y=y-1;
%获取输入参数的样本数与参数数
[m,d]=size(x); %m是x矩阵的行数,表示总共有多少个训练集。d是矩阵的列数,表示训练集的输入。
OutputLayerNum=1; %输出层神经元
v=rand(d,d+1); %输入层与隐层的权值,v是一个d行d+1列矩阵
w=rand(d+1,OutputLayerNum); %隐层与输出层的权值,w是一个d+1行1列矩阵
gamma=rand(d+1); %隐层阈值,gamma是d+1行1列矩阵
theta=rand(OutputLayerNum); %输出层阈值,theta是1行1列矩阵
py=zeros(m,OutputLayerNum); %输出层输出
b=zeros(d+1); %隐层输出
g=zeros(OutputLayerNum); %均方误差对w,gamma求导的参数
e=zeros(d+1); %均方误差对v,theta求导的参数
eta=1; %学习率
kn=0; %迭代的次数
sn=0; %同样的均方误差值累积次数
previous_E=0; %前一次迭代的累计误差
while(1)
kn=kn+1;
E=0; %当前迭代的均方误差
for i=1:m
%计算隐层输出
for j=1:d+1
alpha=0; %当前一个隐层节点神经元的输入
for k=1:d
alpha=alpha+v(k,j)*x(i,k);
en