1. 程式人生 > >perception感知器演算法的C語言實現程式碼

perception感知器演算法的C語言實現程式碼

此處僅給出程式碼實現,具體原理及過程請看前面的博文

檔案輸入格式如下:

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