일부 변경하면 일반적인 경우에 사용 가능함
X = [1 -1 -1], 목표값 -1 일 때, 퍼셉트론 학습 알고리즘에 따라 가중치 변경
초기 가중치는 [0.1 -0.1 0.1]로 한다. 학습률은 1로 가정한다.
예제 풀면서 공부 중인데 손으로 하나하나 숫자 계산하기 싫어서 만들어봄.
#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;
}
'노트정리 > 인공지능' 카테고리의 다른 글
케라스(Keras)에서 custom loss function(손실함수) 정의하기 (0) | 2019.04.21 |
---|---|
파이썬(python)에서 쓸 수 있는 딥러닝(deep learning) 라이브러리 씨아노(theano) 튜토리얼 소개 (0) | 2016.07.20 |
인공 신경망에 관한 설명. 스탠포드 대학 앤드류 응 교수의 sparse autoencoder 정리 노트로 인공신경망 이해하기 (4) | 2016.01.07 |
인공 신경망(artificial neural network)에서 선형분리가능(linearly separable)의 의미 (0) | 2015.11.28 |
딥 러닝(또는 인공신경망) 자바, C++ 무료 라이브러리 (0) | 2015.11.20 |
캐글(kaggle)회장 제레미 하워드(Jeremy Howard)의 컴퓨터가 배울 수 있다는 점이 미래에 가져올 멋지고, 무시무시한 미래. (2) | 2015.08.18 |
뉴로컴퓨터개론 공부 현황 (0) | 2013.12.19 |
요새 관심사 (0) | 2013.12.10 |