1. 程式人生 > >感知器:C++實現版本

感知器:C++實現版本

文章目錄

感知器

這是博主在研究生期間上課的作業,有什麼什麼不妥大家共勉。最近也在重複學習神經網路。

作業要求

在這裡插入圖片描述

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";
	}
}

試驗結果

在這裡插入圖片描述