일부 변경하면 일반적인 경우에 사용 가능함

X = [1 -1 -1], 목표값 -1 일 때, 퍼셉트론 학습 알고리즘에 따라 가중치 변경

초기 가중치는 [0.1 -0.1 0.1]로 한다. 학습률은 1로 가정한다.

 

소스.cpp

 

예제 풀면서 공부 중인데 손으로 하나하나 숫자 계산하기 싫어서 만들어봄.

 

 

#include<iostream>
#include<vector>
using namespace std;

double multiply_matrix(vector<double> X, vector<double> W){
 double NET=0;

 for(int i=0 ; i<(int)X.size() ; i++){
  NET=NET+(X[i]*W[i]);
 }

 return NET;
}

int f(double NET, double T){
 if(NET>T){
  return 1;
 } else if(NET==T) {
  return 0;
 } else {
  return -1;
 }
}

void learning(vector<double> &X, vector<double> &W, vector<double> &dW,
    double &NET, int &y, double &T, double &alpha, int &desired_output){
 do{
  NET=multiply_matrix(X, W);
  y=f(NET, T);
  if(y!=desired_output){
   dW.clear();
   for(int i=0 ; i<(int)W.size() ; i++){
    dW.push_back(alpha*(desired_output-y)*X[i]);
    W[i]=W[i]+dW[i];
   }
  }
  NET=multiply_matrix(X,W);
  y=f(NET, T);
 }while(y!=desired_output);

}

int main(){
 double NET=0;
 int y=0;
 vector<double> X;
 int desired_output=-1;
 vector<double> W;
 vector<double> dW;

 X.push_back(1);
 X.push_back(-1);
 X.push_back(-1);

 W.push_back(0.1);
 W.push_back(-0.1);
 W.push_back(0.1);

 double T=0;
 double alpha=1;

 learning(X, W, dW, NET, y, T, alpha, desired_output);

 cout<<"W = ["<<W[0]<<" "<<W[1]<<" "<<W[2]<<"] d = "<<desired_output<<" y = "<<y<<endl;

 return 0;
}

Posted by 도전하는 공돌이pooh

댓글을 달아 주세요