1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2010 EDF R&D
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.
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.
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
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
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.
31 __author__ = "Sophie RICCI - Juillet 2008"
34 from daCore import BasicObjects, Persistence
35 from ComputeKhi2 import ComputeKhi2_Gauss
38 # ==============================================================================
39 class ElementaryDiagnostic(BasicObjects.Diagnostic,Persistence.OneScalar):
42 def __init__(self, name="", unit="", basetype = None, parameters = {} ):
43 BasicObjects.Diagnostic.__init__(self, name, parameters)
44 Persistence.OneScalar.__init__( self, name, unit, basetype = bool)
45 for key in ["tolerance", "dxclasse", "nbclasses"]:
46 if not self.parameters.has_key(key):
47 raise ValueError("A parameter named \"%s\" is required."%key)
51 Effectue le calcul de la p-value pour un vecteur et une distribution
52 gaussienne et un nombre de classes donne en parametre du diagnostic.
55 [vectclasse, eftho, efobs, valeurKhi2, areaKhi2, message] = ComputeKhi2_Gauss(
57 dx = self.parameters["dxclasse"],
58 nbclasses = self.parameters["nbclasses"],
59 SuppressEmptyClasses = True)
61 logging.info( message )
62 logging.info( "(si <%.2f %s on refuse effectivement l'adéquation)"%(100.*self.parameters["tolerance"],"%") )
63 logging.info("vecteur des classes=%s"%numpy.size(vectclasse) )
64 logging.info("valeurKhi2=%s"%valeurKhi2)
65 logging.info("areaKhi2=%s"%areaKhi2)
66 logging.info("tolerance=%s"%self.parameters["tolerance"])
68 if (areaKhi2 < (100.*self.parameters["tolerance"])) :
69 answerKhisquareTest = False
71 answerKhisquareTest = True
72 logging.info( "La réponse au test est donc est %s"%answerKhisquareTest )
73 return answerKhisquareTest
75 def calculate(self, vector = None, step = None):
77 Active la formule de calcul
80 raise ValueError("One vector must be given to calculate the Khi2 test")
81 V = numpy.array(vector)
83 raise ValueError("The given vector must not be empty")
85 value = self.formula( V )
87 self.store( value = value, step = step)
89 # ==============================================================================
90 if __name__ == "__main__":
91 print "\n AUTODIAGNOSTIC \n"
93 print " Test d adequation du khi-2 a une gaussienne pour un vecteur x"
94 print " connu de taille 1000, issu d'une distribution gaussienne normale"
95 print " en fixant la largeur des classes"
98 # Initialisation des inputs et appel du diagnostic
99 # ------------------------------------------------
102 D = ElementaryDiagnostic("AdequationGaussKhi2", parameters = {
103 "tolerance":tolerance,
108 # Tirage de l'echantillon aleatoire
109 # ---------------------------------
110 numpy.random.seed(2490)
111 x = numpy.random.normal(50.,1.5,1000)
118 print " L'adequation a une distribution gaussienne est valide."
121 raise ValueError("L'adéquation a une distribution gaussienne n'est pas valide.")
124 print " Test d adequation du khi-2 a une gaussienne pour u:n vecteur x"
125 print " connu de taille 1000, issu d'une distribution gaussienne normale"
126 print " en fixant le nombre de classes"
129 # Initialisation des inputs et appel du diagnostic
130 # ------------------------------------------------
133 D = ElementaryDiagnostic("AdequationGaussKhi2", parameters = {
134 "tolerance":tolerance,
136 "nbclasses":nbclasses
139 # Tirage de l'echantillon aleatoire
140 # ---------------------------------
141 numpy.random.seed(2490)
142 x = numpy.random.normal(50.,1.5,1000)
149 print " L'adequation a une distribution gaussienne est valide."
152 raise ValueError("L'adequation a une distribution gaussienne n'est pas valide.")