感知器:C++实现版本

版权声明:所有文章都是自己编写整理,可以转载分享。--Zen in Zen https://blog.csdn.net/weixin_32393347/article/details/85879023

感知器

这是博主在研究生期间上课的作业,有什么什么不妥大家共勉。最近也在重复学习神经网络。

作业要求

在这里插入图片描述

C++源代码

#include<iostream.h>
#include <time.h>
#include <stdlib.h>//随机函数头文件
#include <math.h>
#include <fstream.h>//文件输入输出头文件
void  main()
{
	double P[10][3]={1,0.1,1.2,1,0.7,1.8,1,0.8,1.6,1,0.8,0.6,1,1.0,0.8,1,0.3,0.5,1,0,0.2,1,-0.3,0.8,1,-0.5,-1.5,1,-1.5,-1.3};//样本
	double T[10][2]={1,0,1,0,1,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1};//理想输出
	double W[3][2]={0};//权值
    double Y[10][2]={0.00};//实际输出
	double s;//  活化值
	double ZLW[3][2]={0};//对权值的调整值
	double step=0.5,e=0.00;//定义学习步长和误差
	int i,j,k,pass=0;
	ofstream out ("感知器作业1.txt");//输出到文档感知器作业1.txt
    srand((unsigned)time(NULL));//  为避免随机数相同,以时间为种子产生随机数
	out<<"初始的连接权值和阈值:\n";
	for (i=0;i<3;i++)
	{
		for (j=0;j<2;j++)//对权值赋初始值
		{
			W[i][j]=(rand()%100)/100.000;
			out<<"W["<<i<<"]["<<j<<"]="<<W[i][j]<<"     ";
		}
		out<<" \n";
	}
	do 
	{
		e=0;//误差初始值
		double max=0;//每个训练周期的误差
	    cout<<"\n";
		++pass;//记录训练次数
        /////////////////////////////////////////学习样本///////////////////
		for (i=0;i<10;i++)//对10样本训练
		{
			for (j=0;j<2;j++)
			{
             for (k=0;k<3;k++)
             {
              s=s+P[i][k]*W[k][j];
             }
			 if (s<0)//运用二值函数为作用函数
			 {
				 Y[i][j]=0;
			 } 
			 else
			 {
				 Y[i][j]=1;
			 }
			  s=0.0;//活化值置零
			  e=fabs(T[i][j]-Y[i][j]);
			}
			if (e==0)
			{
				continue;
			}
			
			///////////////////////////////权值修改///////////////////////////
				for (j=0;j<3;j++)//权值调整
				{
					for (k=0;k<2;k++)
					{
						ZLW[j][k]=step*(T[i][k]-Y[i][k])*P[i][j];
						W[j][k]=W[j][k]+ZLW[j][k];
					}
					
				}
		}	
	}
    while (e<0.1&&pass<6000);
    
	out<<"训练次数为:"<<pass<<endl;
	out<<"输出最后的权值:";
	out<<"\n";
	for (i=0;i<3;i++)
	{
		for (j=0;j<2;j++)
		{
			out<<"W["<<i<<"]"<<"["<<j<<"]="<<W[i][j]<<"   ";
		}
		out<<"\n";
	}
    out<<"输出验证结果:训练后实际结果与理想值对比";
	out<<"\n";
	for (i=0;i<10;i++)//十个样本验证结果
	{
		for (j=0;j<2;j++)
		{
			for (k=0;k<3;k++)
			{
				Y[i][j]=Y[i][j]+P[i][k]*W[k][j];
			}
			if(	Y[i][j]<0)
			{	Y[i][j]=0; }
			else
			{	Y[i][j]=1;}
			out<<"Y["<<i<<"]["<<j<<"]="<<Y[i][j]<<"   ";
			out<<"T["<<i<<"]["<<j<<"]="<<T[i][j]<<" \n";
		}
		out<<"\n";
	}
}

试验结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_32393347/article/details/85879023