版权声明:所有文章都是自己编写整理,可以转载分享。--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";
}
}