Neuron: neural networks


gaussian.h
Go to the documentation of this file.
1
2#ifndef NEUR_GAUSS_GAUSSIAN_H
3#define NEUR_GAUSS_GAUSSIAN_H
4
5#include <iostream>
6#include <math.h>
7
8
12{
13public:
15 Gaussian( unsigned ninputs, bool samesigma = true );
16 Gaussian( const Gaussian & g );
18
21 void clear();
22 void init( unsigned ninputs, bool samesigma = true );
24
27 bool isSameSigma() const { return( _sameSigma ); }
28 const double *center() const { return( _center ); }
29 double *center() { return( _center ); }
30 double centerCoord( unsigned n ) const { return( _center[n] ); }
31 void setCenterCoord( unsigned n, double c ) { _center[n] = c; }
32 template<class InputIterator>
33 void setCenter( const InputIterator & start );
34 const double *sigmas() const { return( _sigma ); }
35 double *sigmas() { return( _sigma ); }
36 double sigma( unsigned n = 0 ) const
37 { if( _sameSigma ) return( _sigma[0] ); else return( _sigma[n] ); }
38 void setSigma( unsigned n, double s )
39 { if( _sameSigma ) _sigma[0] = s; else _sigma[n] = s; }
40 unsigned nInputs() const { return _ninputs; }
41 template<class InputIterator>
42 double value( const InputIterator & start ) const;
48 void randInit( double cmin = -1, double cmax = -1, double smin = 0.3,
49 double smax = 5 );
51 void randInitSigma( double smin = 0.3, double smax = 5 );
53 void randInitCenter( double cmin = -1, double cmax = 1 );
55 template<class InputIterator>
56 double arg( const InputIterator & start ) const;
58
60
61protected:
62
63private:
64 unsigned _ninputs;
65 double *_center;
66 double *_sigma;
67 bool _sameSigma;
68};
69
70
71// inline
72
73template<class InputIterator>
74inline
75double Gaussian::value( const InputIterator & start ) const
76{
77 double x = arg( start );
78 return( exp( -( x < 700 ? x : 700 ) ) );
79}
80
81
82template<class InputIterator>
83inline
84double Gaussian::arg( const InputIterator & start ) const
85{
86 double x = 0, tmp;
87 InputIterator it = start;
88 unsigned i;
89 double *center = _center;
90 double *sigma = _sigma;
91
92 if( _sameSigma )
93 {
94 double sig = *sigma;
95 for( i=0; i<_ninputs; ++i, ++it, ++center )
96 {
97 tmp = (*center) - (*it);
98 x += tmp * tmp;
99 }
100 if( sig != 0 )
101 x /= 2 * sig * sig;
102 else
103 std::cerr << "Gaussian : no std deviation\n";
104 }
105 else
106 {
107 for( i=0; i<_ninputs; ++i, ++it, ++center, ++sigma )
108 {
109 tmp = (*center) - (*it);
110 x += ( tmp * tmp ) / ( 2 * (*sigma) * (*sigma) );
111 }
112 }
113 return( x );
114}
115
116
117template<class InputIterator>
118inline void Gaussian::setCenter( const InputIterator & start )
119{
120 InputIterator it = start;
121 unsigned i;
122 double *c = _center;
123
124 for( i=0; i<_ninputs; ++i, ++it, ++c )
125 *c = *it;
126}
127
128
129
130#endif
131
132
133
double * center()
Definition gaussian.h:29
void setCenter(const InputIterator &start)
Definition gaussian.h:118
void setSigma(unsigned n, double s)
Definition gaussian.h:38
void randInitCenter(double cmin=-1, double cmax=1)
Initialise seulement les centres.
void init(unsigned ninputs, bool samesigma=true)
Gaussian(const Gaussian &g)
unsigned nInputs() const
Definition gaussian.h:40
double centerCoord(unsigned n) const
Definition gaussian.h:30
const double * center() const
Definition gaussian.h:28
void clear()
void randInitSigma(double smin=0.3, double smax=5)
Initialise seulement les écarts-types.
Gaussian & operator=(const Gaussian &g)
void setCenterCoord(unsigned n, double c)
Definition gaussian.h:31
void randInit(double cmin=-1, double cmax=-1, double smin=0.3, double smax=5)
Initialise avec des valeurs aléatoires.
const double * sigmas() const
Definition gaussian.h:34
double sigma(unsigned n=0) const
Definition gaussian.h:36
bool isSameSigma() const
Definition gaussian.h:27
Gaussian(unsigned ninputs, bool samesigma=true)
double value(const InputIterator &start) const
Definition gaussian.h:75
double arg(const InputIterator &start) const
Calcule l'argument de l'exponentielle.
Definition gaussian.h:84
double * sigmas()
Definition gaussian.h:35