感知器:C++實現版本
阿新 • • 發佈:2019-01-13
文章目錄
感知器
這是博主在研究生期間上課的作業,有什麼什麼不妥大家共勉。最近也在重複學習神經網路。
作業要求
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"; } }