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'homogénéite entre
23 les distributions de 2 vecteurs quelconques.
24 - entrée : la tolerance (tolerance) et le nombre de classes (nbclasse),
25 sous forme de paramètres dans le dictionnaire Par
26 - sortie : le resultat du diagnostic est une reponse booleenne au test :
27 True si l homogeneite est valide au sens du test du Khi2,
28 False dans le cas contraire.
30 __author__ = "Sophie RICCI - Juillet 2008"
33 from daCore import BasicObjects, Persistence
34 from ComputeKhi2 import ComputeKhi2_Homogen
37 # ==============================================================================
38 class ElementaryDiagnostic(BasicObjects.Diagnostic,Persistence.OneScalar):
39 def __init__(self, name="", unit="", basetype = None, parameters = {} ):
40 BasicObjects.Diagnostic.__init__(self, name, parameters)
41 Persistence.OneScalar.__init__( self, name, unit, basetype = bool )
42 for key in ["tolerance", "dxclasse", "nbclasses"]:
43 if not self.parameters.has_key(key):
44 raise ValueError("A parameter named \"%s\" is required."%key)
46 def _formula(self, V1, V2):
48 Effectue le calcul de la p-value pour deux vecteurs et un nombre de
49 classes donne en parametre du diagnostic.
51 [classes, eftheo, efobs, valeurKhi2, areaKhi2, message] = ComputeKhi2_Homogen(
54 dx = self.parameters["dxclasse"],
55 nbclasses = self.parameters["nbclasses"],
56 SuppressEmptyClasses = True)
58 logging.info( message )
59 logging.info( "(si <%.2f %s on refuse effectivement l'homogeneite)"%(100.*self.parameters["tolerance"],"%") )
61 answerKhisquareTest = False
62 if (areaKhi2 < (100.*self.parameters["tolerance"])) :
63 answerKhisquareTest = False
65 answerKhisquareTest = True
67 return answerKhisquareTest
69 def calculate(self, vector1 = None, vector2 = None, step = None):
71 Active la formule de calcul
73 if (vector1 is None) or (vector2 is None) :
74 raise ValueError("Two vectors must be given to calculate the Khi2 value")
75 V1 = numpy.array(vector1)
76 V2 = numpy.array(vector2)
77 if (V1.size < 1) or (V2.size < 1):
78 raise ValueError("The given vectors must not be empty")
79 if V1.size != V2.size:
80 raise ValueError("The two given vectors must have the same size")
82 value = self._formula( V1, V2 )
84 self.store( value = value, step = step )
86 # ==============================================================================
87 if __name__ == "__main__":
88 print "\n AUTODIAGNOSTIC \n"
90 print " Test d'homogeneite du Khi-2 pour deux vecteurs de taille 10,"
91 print " issus d'une distribution gaussienne normale"
94 # Initialisation des inputs et appel du diagnostic
95 # --------------------------------------------------------------------
98 D = ElementaryDiagnostic("HomogeneiteKhi2", parameters = {
99 "tolerance":tolerance,
104 # Tirage de l'echantillon aleatoire
105 # --------------------------------------------------------------------
106 numpy.random.seed(4000)
107 x1 = numpy.random.normal(50.,1.5,10000)
108 numpy.random.seed(2490)
109 x2 = numpy.random.normal(50.,1.5,10000)
112 # --------------------------------------------------------------------
115 print " La reponse du test est \"%s\" pour une tolerance de %.2e et une largeur de classe de %.2e "%(D.valueserie(0), tolerance, dxclasse)