简单BP算法实现
程序员文章站
2022-07-05 08:45:09
...
算法流程
Matlab实现
clear all;
%step1
xp=[1,3];
yp=[0.95,0.35];
err_max=0.01;
iterate=0;
xp_tmp=[1 1 1];
step=0.1;
nums=1;
result=[];
%初始权值
w1_1=-1 + (1+1)*rand(1,3);
w1_2=-1 + (1+1)*rand(1,3);
w2_1=-1 + (1+1)*rand(1,3);
w2_2=-1 + (1+1)*rand(1,3);
xp_tmp(1:2)=xp(1:2);
%step2
while(1)
nums=nums+1;
net1_1=w1_1*xp_tmp';
net1_2=w1_2*xp_tmp';
o1=1/(1+exp(-net1_1));
o2=1/(1+exp(-net1_2));
tmp2=[o1 o2 1];
net2_1=w2_1*tmp2';
net2_2=w2_2*tmp2';
y1=1/(1+exp(-net2_1));
y2=1/(1+exp(-net2_2));
%step3
e_tmp=((y1-yp(1))^2+(y2-yp(2))^2)/2;
result=[result e_tmp];
if(e_tmp>err_max)
%step4
delt1_2=(yp(1)-y1)*y1*(1-y1);
delt2_2=(yp(2)-y2)*y2*(1-y2);
delt1_1=(delt1_2*w2_1(1)+delt2_2*w2_2(1))*o1*(1-o1);
delt2_1=(delt1_2*w2_1(2)+delt2_2*w2_2(2))*o2*(1-o2);
%step5
w1_1(1)=w1_1(1)+step*delt1_1*xp(1);
w1_1(2)=w1_1(2)+step*delt1_1*xp(2);
w1_1(3)=w1_1(3)+step*delt1_1*1;
w1_2(1)=w1_2(1)+step*delt2_1*xp(1);
w1_2(2)=w1_2(2)+step*delt2_1*xp(2);
w1_2(3)=w1_2(3)+step*delt2_1*1;
w2_1(1)=w2_1(1)+step*delt1_2*o1;
w2_1(2)=w2_1(2)+step*delt1_2*o2;
w2_1(3)=w2_1(3)+step*delt1_2*1;
w2_2(1)=w2_2(1)+step*delt2_2*o1;
w2_2(2)=w2_2(2)+step*delt2_2*o2;
w2_2(3)=w2_2(3)+step*delt2_2*1;
else
break;
end
end
plot(result);xlabel(['steps:',num2str(nums)]);
ylabel('Mean squared error');
结果分析
VC++实现
#include <iostream>
#include <algorithm>
#include <vector>
#include <time.h>
#include <string>
#include<cmath>
using namespace std;
int main()
{
srand((unsigned int)time(NULL));
vector<int> xp = { 1,3 };
vector<double> yp = { 0.95,0.35 };
float err_max = 0.01;
int iterator = 0;
vector<int> xp_tmp = { 0,0,1 };
float step = 0.1;
int nums = 1;
vector<double> w11, w12, w21, w22, tmp2, result;
//初始权值随机
double r;
for (int i = 0; i<3; i++)
{
r = rand() % 20000 - 10000;
w11.push_back(r / 10000.0);
r = rand() % 20000 - 10000;
w12.push_back(r / 10000.0);
r = rand() % 20000 - 10000;
w21.push_back(r / 10000.0);
r = rand() % 20000 - 10000;
w22.push_back(r / 10000.0);
}
xp_tmp[0] = xp[0];
xp_tmp[1] = xp[1];
//step2
while (1)
{
double net11 = 0.0, net12 = 0.0, net21 = 0.0, net22 = 0.0,
o1 = 0.0, o2 = 0.0, y1 = 0.0, y2 = 0.0, e_tmp = 0.0,
del12 = 0.0, del22 = 0.0, del11 = 0.0, del21 = 0.0;
nums++;
for (int i = 0; i<3; i++)
{
net11 += w11[i] * xp_tmp[i];
net12 += w12[i] * xp_tmp[i];
}
o1 = 1 / (1 + exp(-net11));
o2 = 1 / (1 + exp(-net12));
tmp2.push_back(o1);
tmp2.push_back(o2);
tmp2.push_back(1.0);
for (int i = 0; i<3; i++)
{
net21 += w21[i] * tmp2[i];
net22 += w22[i] * tmp2[i];
}
y1 = 1 / (1 + exp(-net21));
y2 = 1 / (1 + exp(-net22));
//step3
e_tmp = 0.5*((y1 - yp[0])*(y1 - yp[0]) + (y2 - yp[1])*(y2 - yp[1]));
result.push_back(e_tmp);
if (e_tmp>err_max)
{
//step4
del12 = (yp[0] - y1)*y1*(1 - y1);
del22 = (yp[1] - y2)*y2*(1 - y2);
del11 = (del12*w21[0] + del22*w22[0])*o1*(1 - o1);
del21 = (del12*w21[1] + del22*w22[1])*o2*(1 - o2);
//step5
w11[0] += step*del11*xp[0];
w11[1] += step*del11*xp[1];
w11[2] += step*del11 * 1;
w12[0] += step*del21*xp[0];
w12[1] += step*del21*xp[1];
w12[2] += step*del21 * 1;
w21[0] += step*del12*o1;
w21[1] += step*del12*o2;
w21[2] += step*del12 * 1;
w22[0] += step*del22*o1;
w22[0] += step*del22*o2;
w22[0] += step*del22 * 1;
}
else
{
cout << "y1,y2:" << y1 << "," << y2 << endl;
break;
}
}
cout << "steps:" << nums << endl;
cout << "*********************************" << endl;
cout << "mean squared error" << endl;
for (int i = 0; i < result.size(); i++)
{
cout << result[i] << endl;
}
cout << "***********************************" << endl;
cout << "w11:" << endl;
for (int i = 0; i < w11.size(); i++)
{
cout << w11[i] <<" ";
}
cout << endl;
cout << "w12:" << endl;
for (int i = 0; i < w12.size(); i++)
{
cout << w12[i] <<" ";
}
cout << endl;
cout << "w21:" << endl;
for (int i = 0; i < w21.size(); i++)
{
cout << w21[i] <<" ";
}
cout << endl;
cout << "w22:" << endl;
for (int i = 0; i < w22.size(); i++)
{
cout << w22[i] <<" ";
}
cout << endl;
system("pause");
return 0;
}
输出结果