欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单BP算法实现

程序员文章站 2022-07-05 08:45:09
...

算法流程

简单BP算法实现

简单BP算法实现

 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');

结果分析 

简单BP算法实现

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;
}

输出结果

简单BP算法实现