C++实现:双输入单输出系统:建立一个 感知器网络,实现上述样本的分类。计算出相应的网络权值矩阵w。
2014-11-29 21:07
711 查看
练习题:
双输入单输出系统:
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画图
代码
双输入单输出系统:
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 >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 =e[0]+e[1]+e[2]+e[3]; /*cout<<"Yi"<<Y[i]<<endl; cout<<"e["<<i<<"]="<<e[i]<<endl;*/ cout<<"E["<<n<<"]="<<E <<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; }
相关文章推荐
- c++第九周【任务4】建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作。
- 《C++第九周实验报告4-1》---建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数, //完成矩阵的输入、输出、加、减、相等判断等操作。
- 【算法】 输入n 输出一个n*n的zigzag矩阵 利用c++实现
- 第九周C++任务四。建立一个二维数组类Douary,完成矩阵的输入、输出、加、减、相等判断等操作
- 建立一个二维坐标系的类TwoCoor,用x、y表示坐标值,实现两坐标点的加减运算,计算两坐标点之间的距离,并重载输入输出运算符,使之能够直接输入输出坐标点的坐标值。
- 用C++实现,输入一个日期,输出它是一年中的第几天。
- 用C++实现,输入一个日期,输出它是一年中的第几天。
- 面试例题:输入n,求一个n x n矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)
- 热身:一个基于矩阵的快速计算神经网络输出的方法
- 第九周实验报告任务4 建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作。
- 输入读入一个String 序列,计算元音字母的个数,然后再顺序输出--C++
- 设计一个学生成绩管理系统,实现对学生成绩的动态管理,实现对学生成绩的输入,显示,删除,查找,插入,最佳,保存,计算,排序等主要功能
- 要求程序能够实现通过输入系统建立时的年月日,和当前的年月日,计算出建立的时间长短,只用具体到年就行。
- C++实现单层感知器网络_智能计算作业1
- 第九周任务四之 建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作。
- 第九周实验报告(四)建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- 对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解
- (用指针方法处理)有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。编写一个函数实现上述功能,在主函数中输入n个整数,并输出调整后的n个数
- 编写一个程序,定义一个职工类,输入3个职工的编号、姓名、工资和年龄, 类中的成员函数实现输入、输出,在主函数中定义对象,并计算输出3个职工的平均工资。