C++实现:双输入单输出系统:建立一个 感知器网络,实现上述样本的分类。计算出相应的网络权值矩阵w。

49 篇文章 1 订阅
19 篇文章 2 订阅

练习题:

       双输入单输出系统:

                 x1(1)=1                   x2(1)=1                         d(1)=1

                 x1(2)=-0.5              x2(2)=-1                        d(2)=-1

                 x1(3)=3                  x2(3)=1                         d(3)=1

                 x1(4)=-2                 x2(4)=-1                        d(4)=-1  

        建立一个 感知器网络,实现上述样本的分类。

         计算出相应的网络权值矩阵w。

说明:

用了opencv画图

代码

#include<iostream>
#include"math.h"
#include <opencv2/core/core.hpp>
//#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
//
//#include "linefinder.h"
//#include "edgedetector.h"

using namespace cv;
using namespace std;
int main()
{
	double W[4][3];
	
	for(int i=0;i<4;i++)
	{
		W[i][1]=0.5;
		W[i][2]=0.5;
	}

	double X[4][3]={-1,1,1,
		-1,-0.5,-1,
		-1,3,1,
		-1,-2,-1};
	double d[4]={1,-1,1,-1};
	double e[4];
	double E[10]={0,0,0,0,0,0,0,0,0,0};
	double b=5;
	//W[][0]=b;
	for(int i=0;i<4;i++)
		W[i][0]=b;
	double l=0.1;
	/*W[0][1]=rand()%10*0.1;
	W[0][2]=rand()%10*0.1;
	W[1][1]=rand()%10*0.1;
	W[1][2]=rand()%10*0.1;
	W[2][1]=rand()%10*0.1;
	W[2][2]=rand()%10*0.1;
	W[3][1]=rand()%10*0.1;
	W[3][2]=rand()%10*0.1;*/
	cout<<W[0][1]<<endl<<W[0][2]<<endl;
	cout<<W[1][1]<<endl<<W[1][2]<<endl;
	cout<<W[2][1]<<endl<<W[2][2]<<endl;
	cout<<W[3][1]<<endl<<W[3][2]<<endl;
	double Y[4]={0};
	for(int i=0;i<4;i++)
	{
		Y[i]=W[i][0]*X[i][0]+W[i][1]*X[i][1]+W[i][2]*X[i][2];
		//cout<<"Y["<<i<<"]="<<Y[i]<<endl;
		if(Y[i]>=0)
			Y[i]=1;
		else
			Y[i]=-1;

		e[i]=abs(d[i]-Y[i]);
	}
	E[0]=e[0]+e[1]+e[2]+e[3];
	cout<<"E{0]="<<E[0]<<endl;
	//cout<<"e1"<<e[i]<<endl;
	int n=0;
	while(E[n]>0)
	{
		n++;
		for(int i=0;i<4;i++)
		{

			W[i][1]=W[i][1]+l*(d[i]-Y[i])*X[i][1];
			W[i][2]=W[i][2]+l*(d[i]-Y[i])*X[i][2];
			//cout<<W[i][1]<<endl<<W[i][2]<<endl;
			Y[i]=W[i][0]*X[i][0]+W[i][1]*X[i][1]+W[i][2]*X[i][2];
			if(Y[i]>=0)
				Y[i]=1;
			else
				Y[i]=-1;

			e[i]=abs(d[i]-Y[i]);
			//cout<<"e"<<e[i]<<endl;
		}

		E[n]=e[0]+e[1]+e[2]+e[3];
		/*cout<<"Yi"<<Y[i]<<endl;
		cout<<"e["<<i<<"]="<<e[i]<<endl;*/
		cout<<"E["<<n<<"]="<<E[n]<<endl;

	}
	cout<<"W[]="<<endl;
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<3;j++)
			cout<<W[i][j]<<" ";
	cout<<endl;
	}
	//E=e[0]+e[1]+e[2]+e[3];
	cout<<"ok"<<endl;
	/*IplImage *test=cvCreateImage(cvSize(400,400),IPL_DEPTH_16U,0);
	Mat mtx(test);*/
	Mat test(400,400,CV_8UC3,Scalar(130,240,205));//3通道图像
	line(test,Point(20,400-20),Point(20,0),Scalar(0));//因为mat型图像的原点在右上角,所以比较麻烦,要通过计算转换
	line(test,Point(20,400-20),Point(400,400-20),Scalar(0));
	for(int i=0;i<10;i++)
	{
		line(test,Point(20*(i+1),380-20*E[i]),Point(20*(i+2),380-20*E[i+1]),Scalar(220,0,150));
	}

	/*for(int i=0;i<10;i++)
	{
	line(test,Point(20*(i+1),20*E[i]),Point(20*(i+2),20*E[i+1]),Scalar(255));
	}*/

	// Display the test image
	namedWindow("E Image");
	imshow("E Image",test);
	imwrite("test.bmp",test);
	waitKey();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值