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 }


浙公网安备 33010602011771号