Bonjour à toutes et à tous
Je suis en train de coder un framework bayésien.
Le principe c'est ça : on a des modèles mathématiques qui sont des fonction paramétrées :
- Linéaire : y = a.x+b, => deux paramètres a et b
- Foo : y = m.x^d + c => trois paramètres m, d, c
- etc... pour une collection de fonctions.
On veut faire des simulations basées sur ces fonctions, en faisant varier les paramètres de chaque fonction à chaque simulation. Pour faire varier chaque paramètre, il faut faire un tirage dans un "prior", c'est à dire une distribution de probabilité bien précise, elle-même paramétrée. Par exemple une uniforme.
J'ai fait un arbre d'héritage qui me semblait cool (donc évidemment qui pose problème) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class IMathematicalParametrizedFunction { public: ... virtual double operator()() const = 0; // On peut rien dire sur quoi appliquer la fonction virtual void SetParameters() = 0; // On peut rien dire sur le nombre de paramètres protected: std::string _name; std::string _expression; std::map<std::string, double> _parameters; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Linear : public IMathematicalParametrizedFunction { public: ... double operator()(const double &x) const; // On applique la linéaire sur un réel void SetParameters(const double & a, const double & b); // Il y a deux paramètres à modifier }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class IPriorDistribution : public IMathematicalParametrizedFunction { public: ... virtual double operator()(void) const = 0; // On sait ici qu'il n'y aura pas besoin d'argument, faut juste faire un tirage aléatoire. void SetParameters(); // On peut toujours rien dire sur le nombre de paramètres à prendre }Et bon vous vous en douterez il y a pas mal de soucis avec les signatures, et donc des fonction virtuelles pure non implémentées dans les classes dérivées. Comment faudrait-il que je m'y prenne ? J'ai lu ce fil là : http://www.developpez.net/forums/d13...ture-variable/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Uniform : public IPriorDistribution { public: ... double operator()(void) const; void SetParameters(const double & a, const double & b); // Signature différente. }
Il y a bien l'idée de faire un vector, mais (je crois que ?) je perds la transparence sur les paramètres. En effet, les paramètres ont une signification bien précise selon la place qu'ils ont dans l'expression de la fonction, ils ont également un nom "consacré" par la littérature (genre a et b pour la linéaire, ou lower/upper ou a/b pour l'uniforme, ou lambda pour la Poisson.).
Je m'étonne de pas pouvoir dire dans la classe ancestrale : "Mes filles ont besoin de ce comportement là pour fonctionner, mais je ne peux rien dire sur leur signature".
Des idées/contestations/suggestions ?
Merci d'avance !!!
Cordialement,
[Edit] : ici http://stackoverflow.com/questions/2...tual-functions ils proposent de stocker les paramètres au moment de la construction, ce que je fais déjà. Mais je n'avais pas envie de reconstruire l'objet de 0 à chaque ré-actualisation de ses valeurs de paramètres :/
Partager