summaryrefslogtreecommitdiff
path: root/Neurone/NeuroneB.cpp
blob: 4556f8ed2c75966b33d1bae05dcd5a6610305863 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include"./NeuroneB.h"
/**
 * Constructeur du Neurone avec biais
 * @method NeuroneB::NeuroneB
 * @param  taille             Taille du neurone
 * @param  x                  Vecteur de poids
 * @param  biais_w            Valeur du biais
 */
NeuroneB::NeuroneB(int taille,std::vector<double> * x, double biais_w){
    n = taille;
    w = x;
    w->push_back(biais_w);
}

/**
 * Constructeur du Neurone avec biais
 * @method NeuroneB::NeuroneB
 * @param  taille             Taille du neurone
 */
NeuroneB::NeuroneB(int taille,FonctionActivation::EnumFonctionActivation fct) {
  n = taille;
  fonctionActivation.setFonctionActivation(fct);
  aleaWeights();
}

/**
 * Affichage des poids
 * @method NeuroneB::printWeight
 */
void NeuroneB::printWeight(){
  Neurone::printWeight();
  std::cout << "biais = " << (*w)[n] << std::endl;
}

/**
 * Génération aléatoire des poids
 * @method NeuroneB::aleaWeights
 */
void NeuroneB::aleaWeights(){
  w = new std::vector<double> (n,0.8);
  std::default_random_engine generator(std::random_device{}());
  std::normal_distribution<double> distribution(0,1);
  for (int i=0; i<n; i++) {
    (*w)[i] = distribution(generator);
  }
  w->push_back(distribution(generator));
}

/**
  * Méthode d'apprentissage (cf Neurone::fw_sum, cf Neurone::fw_activate, cf Neurone::derive_activate)
  * @method Neurone::learn
  * @param  x              Vecteur de poids
  * @param  o              Valeur attendue
  * @param  k              Valeur du biais
  * @param  mu             Taux d'apprentissage | Learning rate
 */
void NeuroneB::learn(std::vector<double> x,double o,double k, double mu){
  double sum = fw_sum(x);
  double res = fw_activate(sum,k);
  double derive = derive_activate(sum,k);
  for(int i=0; i<n; i++){
      (*w)[i]= (*w)[i]-  mu * (x[i]*derive*((o-res)*(-2)));
  }
  (*w)[n] = (*w)[n]-  mu * (1*derive*((o-res)*(-2)));
}

/**
 * Méthode de somme du vecteur de poids
 * @method NeuroneB::fw_sum
 * @param  x                Vecteur de poids
 * @return                  Somme des poids
 */
double NeuroneB::fw_sum(std::vector<double> x)const{
  double res = Neurone::fw_sum(x);
  res += (*w)[n];
  return res;
}

/**
 * @method NeuroneB::getNbPoids
 * @return Nombre de poids
 */
int NeuroneB::getNbPoids(){
  return n+1;
}