1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2009 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"
33 import sys ; sys.path.insert(0, "../daCore")
36 from numpy import random
38 from BasicObjects import Diagnostic
39 from ComputeKhi2 import ComputeKhi2_Gauss
42 # ==============================================================================
43 class ElementaryDiagnostic(Diagnostic,Persistence.OneScalar):
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)
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.
59 [vectclasse, eftho, efobs, valeurKhi2, areaKhi2, message] = ComputeKhi2_Gauss(
61 dx = self.parameters["dxclasse"],
62 nbclasses = self.parameters["nbclasses"],
63 SuppressEmptyClasses = True)
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"])
73 if (areaKhi2 < (100.*self.parameters["tolerance"])) :
74 answerKhisquareTest = False
76 answerKhisquareTest = True
77 logging.info( "La réponse au test est donc est %s"%answerKhisquareTest )
78 return answerKhisquareTest
80 def calculate(self, vector = None, step = None):
82 Active la formule de calcul
85 raise ValueError("One vector must be given to calculate the Khi2 test")
86 V = numpy.array(vector)
88 raise ValueError("The given vector must not be empty")
90 value = self.formula( V )
92 self.store( value = value, step = step)
94 # ==============================================================================
95 if __name__ == "__main__":
96 print "\n AUTODIAGNOSTIC \n"
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"
103 # Initialisation des inputs et appel du diagnostic
104 # ------------------------------------------------
107 D = ElementaryDiagnostic("AdequationGaussKhi2", parameters = {
108 "tolerance":tolerance,
113 # Tirage de l'echantillon aleatoire
114 # ---------------------------------
115 numpy.random.seed(2490)
116 x = random.normal(50.,1.5,1000)
123 print " L'adequation a une distribution gaussienne est valide."
126 raise ValueError("L'adéquation a une distribution gaussienne n'est pas valide.")
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"
134 # Initialisation des inputs et appel du diagnostic
135 # ------------------------------------------------
138 D = ElementaryDiagnostic("AdequationGaussKhi2", parameters = {
139 "tolerance":tolerance,
141 "nbclasses":nbclasses
144 # Tirage de l'echantillon aleatoire
145 # ---------------------------------
146 numpy.random.seed(2490)
147 x = random.normal(50.,1.5,1000)
154 print " L'adequation a une distribution gaussienne est valide."
157 raise ValueError("L'adequation a une distribution gaussienne n'est pas valide.")