c++~实现感应器学习算法~1

利用Eigen实现感应器学习算法,用学and运算和or运算。

 1 //Perceptron learn and operator
 2 #include<iostream>
 3 #include<Eigen/Dense>
 4 
 5 using namespace std;
 6 using namespace Eigen;
 7 
 8 #define COL 2
 9 #define NUM 4
10 
11 class Perceptron{
12     private:
13         Matrix<double,1,COL> weigths;  //权重矩阵
14         double bias;                   //偏移
15         int step_func(int x);          //激活函数
16     public:
17         int trianum;                   //训练数据数量
18         Perceptron();
19         void show();
20         int predict(const Matrix<double,COL,1>& input);
21         void train(Matrix<double,COL,1>* input,int* label,
22             int iteration,double rate);
23         void one_iteration(Matrix<double,COL,1>* input,int* labels,
24              float rate);
25         void update_weights(const Matrix<double,COL,1>& input,int 
26             output,int label,float rate);
27 };
28 
29 int Perceptron::step_func(int x){
30     int a=x>0 ? 1:0;
31     return a;
32 }
33 
34 Perceptron::Perceptron(){
35     weigths.setZero();
36     bias=0;
37 }
38 
39 void Perceptron::show(){
40     cout<<"The weigths "<<weigths<<" and the bias "
41         <<bias<<endl;
42 }
43 
44 int Perceptron::predict(const Matrix<double,COL,1>& input){
45     double temp=weigths*input;
46     temp+=bias;
47     return step_func(temp);
48 }
49 
50 void Perceptron::train(Matrix<double,COL,1>* input,int* label
51     ,int iteration,double rate){
52     for(int i=0; i<iteration;i++){
53         one_iteration(input,label,rate);
54     }
55 }
56 
57 void Perceptron::one_iteration(Matrix<double,COL,1>* input,
58     int* labels,float rate){
59     for(int i=0; i<trianum;i++){
60         int output=predict(input[i]);
61         update_weights(input[i],output,labels[i],rate);
62     }
63 }
64 
65 void Perceptron::update_weights(const Matrix<double,COL,1>& 
66     input,int output,int label,float rate){
67     int delta=label-output;
68     weigths+=rate*delta*input.transpose();
69     bias+=rate*delta;
70 }
71 
72 int main(){
73     Perceptron percetron;
74     Matrix<double,COL,1> _triandata[NUM]; 
75     int temptrian[]={1,1,0,0,1,0,0,1};
76     int label[]={1,0,1,1};
77     percetron.trianum=sizeof(label)/sizeof(int);
78     for(int i=0,j=0 ;i<NUM;i++,j+=COL){
79         _triandata[i](0,0)=temptrian[j];
80         _triandata[i](1,0)=temptrian[j+1];
81     }
82     cout<<"Start trianing "<<endl;
83     percetron.show();
84     percetron.train(_triandata,label,10,0.1);
85     percetron.show();
86     cout<<"Testing trian result"<<endl;
87     for(int i=0, j=0; i<NUM;i++,j+=2){
88         cout<<temptrian[j]<<" or "<<temptrian[j+1]<<"=  ";
89         cout<<percetron.predict(_triandata[i])<<endl;
90     }
91 }

posted @ 2018-06-09 23:08  椎体  阅读(415)  评论(0)    收藏  举报