]> SALOME platform Git repositories - modules/adao.git/blob - src/daComposant/daDiagnostics/GaussianAdequation.py
Salome HOME
Initial Commit
[modules/adao.git] / src / daComposant / daDiagnostics / GaussianAdequation.py
1 #-*-coding:iso-8859-1-*-
2 #
3 #  Copyright (C) 2008-2009  EDF R&D
4 #
5 #  This library is free software; you can redistribute it and/or
6 #  modify it under the terms of the GNU Lesser General Public
7 #  License as published by the Free Software Foundation; either
8 #  version 2.1 of the License.
9 #
10 #  This library is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 #  Lesser General Public License for more details.
14 #
15 #  You should have received a copy of the GNU Lesser General Public
16 #  License along with this library; if not, write to the Free Software
17 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21 __doc__ = """
22     Diagnostic qui effectue le test du Khi2 pour juger de l'adéquation entre 
23     la distribution d'un échantillon et une distribution gaussienne dont la 
24     moyenne et l'écart-type sont calculés sur l'échantillon.
25     En input : la tolerance(tolerance) et le nombre de classes(nbclasse)
26     En output : Le resultat du diagnostic est une reponse booleenne au test : 
27                 True si l adequation a une distribution gaussienne est valide 
28                 au sens du test du Khi2, 
29                 False dans le cas contraire. 
30 """
31 __author__ = "Sophie RICCI - Juillet 2008"
32
33 import sys ; sys.path.insert(0, "../daCore")
34
35 import numpy
36 from numpy import random
37 import Persistence
38 from BasicObjects import Diagnostic
39 from ComputeKhi2 import ComputeKhi2_Gauss
40 import logging
41
42 # ==============================================================================
43 class ElementaryDiagnostic(Diagnostic,Persistence.OneScalar):
44     """
45     """
46     def __init__(self, name="", unit="", basetype = None, parameters = {} ):
47         Diagnostic.__init__(self, name, parameters)
48         Persistence.OneScalar.__init__( self, name, unit, basetype = bool)
49         for key in ["tolerance", "dxclasse", "nbclasses"]:
50             if not self.parameters.has_key(key):
51                 raise ValueError("A parameter named \"%s\" is required."%key)
52
53     def formula(self, V):
54         """
55         Effectue le calcul de la p-value pour un vecteur et une distribution 
56         gaussienne et un nombre de classes donne en parametre du diagnostic. 
57         """
58
59         [vectclasse, eftho, efobs, valeurKhi2, areaKhi2, message] = ComputeKhi2_Gauss( 
60             vectorV = V, 
61             dx = self.parameters["dxclasse"],
62             nbclasses = self.parameters["nbclasses"],
63             SuppressEmptyClasses = True)
64
65
66         logging.info( message )
67         logging.info( "(si <%.2f %s on refuse effectivement l'adéquation)"%(100.*self.parameters["tolerance"],"%") )
68         logging.info("vecteur des classes=%s"%numpy.size(vectclasse) )
69         logging.info("valeurKhi2=%s"%valeurKhi2) 
70         logging.info("areaKhi2=%s"%areaKhi2) 
71         logging.info("tolerance=%s"%self.parameters["tolerance"])
72
73         if (areaKhi2 < (100.*self.parameters["tolerance"])) :
74             answerKhisquareTest = False
75         else:
76             answerKhisquareTest = True
77         logging.info( "La réponse au test est donc est %s"%answerKhisquareTest )
78         return answerKhisquareTest
79
80     def calculate(self, vector = None,  step = None):
81         """
82         Active la formule de calcul
83         """
84         if vector is None:
85             raise ValueError("One vector must be given to calculate the Khi2 test")
86         V = numpy.array(vector)
87         if V.size < 1:
88             raise ValueError("The given vector must not be empty")
89         #
90         value = self.formula( V )
91         #
92         self.store( value = value,  step = step)
93
94 # ==============================================================================
95 if __name__ == "__main__":
96     print "\n AUTODIAGNOSTIC \n"
97
98     print " Test d adequation du khi-2 a une gaussienne pour un vecteur x"
99     print " connu de taille 1000, issu d'une distribution gaussienne normale"
100     print " en fixant la largeur des classes"
101     print 
102     #
103     # Initialisation des inputs et appel du diagnostic
104     # ------------------------------------------------
105     tolerance = 0.05
106     dxclasse = 0.1
107     D = ElementaryDiagnostic("AdequationGaussKhi2", parameters = {
108         "tolerance":tolerance,
109         "dxclasse":dxclasse, 
110         "nbclasses":None, 
111         })
112     #
113     # Tirage de l'echantillon aleatoire 
114     # ---------------------------------
115     numpy.random.seed(2490)
116     x = random.normal(50.,1.5,1000)
117     #
118     # Calcul 
119     # ------
120     D.calculate(x)
121     #
122     if D.valueserie(0) :
123         print " L'adequation a une distribution gaussienne est valide."
124         print
125     else :
126         raise ValueError("L'adéquation a une distribution gaussienne n'est pas valide.")
127
128
129     print " Test d adequation du khi-2 a une gaussienne pour u:n vecteur x"
130     print " connu de taille 1000, issu d'une distribution gaussienne normale"
131     print " en fixant le nombre de classes"
132     print
133     #
134     # Initialisation des inputs et appel du diagnostic
135     # ------------------------------------------------
136     tolerance = 0.05
137     nbclasses = 70.
138     D = ElementaryDiagnostic("AdequationGaussKhi2", parameters = {
139         "tolerance":tolerance,
140         "dxclasse":None, 
141         "nbclasses":nbclasses 
142         })
143     #
144     # Tirage de l'echantillon aleatoire 
145     # ---------------------------------
146     numpy.random.seed(2490)
147     x = random.normal(50.,1.5,1000)
148     #
149     # Calcul 
150     # ------
151     D.calculate(x)
152     #
153     if D.valueserie(0) :
154         print " L'adequation a une distribution gaussienne est valide."
155         print
156     else :
157         raise ValueError("L'adequation a une distribution gaussienne n'est pas valide.")
158
159