perception感知器演算法的C語言實現程式碼
阿新 • • 發佈:2019-02-05
此處僅給出程式碼實現,具體原理及過程請看前面的博文
檔案輸入格式如下:
2 4 0.25 5
0 0 0
0 1 1
1 0 1
1 1 1
0.06230 0.01123 -0.07335
含義如下:
實現程式碼如下:(注:為了通用性,本程式碼只輸出了最後一次迭代結果)
#include<iostream> #include <stdio.h> using namespace std; double hypothose(double w[],int feature_num,double* training_set){ double sum=0; for(int i=0;i<feature_num;i++){ sum+=w[i]*training_set[i]; } if (sum>0) return 1; else return 0; } //以下函式為感知器演算法真正函式,引數分別是特徵個數,訓練樣本數,學習速率,迭代次數,訓練樣本,初始w陣列 void perception(int feature_num,int training_num,double a,int times,double** training_set,double w[]){ int dimentions=feature_num+1; while(times--){ double* delta_w=new double[feature_num]; for(int i=0;i<feature_num;i++){ delta_w[i]=0; } for(int i=0;i<training_num;i++){ for(int j=0;j<feature_num;j++){ delta_w[j]+=(training_set[i][feature_num]-hypothose(w,feature_num,training_set[i]))*training_set[i][j]*a; } } for(int i=0;i<feature_num;i++){ w[i]+=delta_w[i]; } delete[] delta_w; } } int main(){ int feature_num,training_num,times; double a; freopen("in.txt","r",stdin); while(cin>>feature_num>>training_num>>a>>times){ double** training_set=new double*[ training_num]; for(int i=0;i<training_num;i++){ training_set[i]=new double[training_num+2]; } double* w=new double[feature_num+1]; for(int i=0;i<training_num;i++){ training_set[i][0]=1; } for(int i=0;i<training_num;i++){ for(int j=1;j<=feature_num+1;j++){ cin>>training_set[i][j]; } } for(int i=0;i<=feature_num;i++){ cin>>w[i]; } perception(feature_num+1,training_num,a,times,training_set,w); for(int i=0;i<feature_num;i++){ cout<<w[i]<<' '; } cout<<w[feature_num]<<endl; delete[] w; for(int i=0;i<training_num;i++){ delete[] training_set[i]; } delete[] training_set; } return 0; }