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

来源:互联网 发布:mac待机耗电很快 编辑:程序博客网 时间:2024/06/05 20:04

练习题:

       双输入单输出系统:

                 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;elseY[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;elseY[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 imagenamedWindow("E Image");imshow("E Image",test);imwrite("test.bmp",test);waitKey();return 0;}


0 0
原创粉丝点击