C2MV commited on
Commit
2901ec9
·
verified ·
1 Parent(s): 6502d65

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -14
app.py CHANGED
@@ -11,6 +11,7 @@ from sklearn.preprocessing import PolynomialFeatures
11
  from sklearn.metrics import r2_score
12
  from itertools import combinations
13
  import tempfile
 
14
 
15
  # Clase para el modelo de regresión
16
  class RegressionModel:
@@ -27,7 +28,7 @@ class RegressionModel:
27
  X_poly = self.poly.transform(X)
28
  return self.model.predict(X_poly)
29
 
30
- def r2_score(self, X, y):
31
  y_pred = self.predict(X)
32
  return r2_score(y, y_pred)
33
 
@@ -66,8 +67,8 @@ class ExperimentalDesign:
66
  self.model_variable1.fit(X, self.variable1_values)
67
  self.model_variable2.fit(X, self.variable2_values)
68
 
69
- self.r2_variable1 = self.model_variable1.r2_score(X, self.variable1_values)
70
- self.r2_variable2 = self.model_variable2.r2_score(X, self.variable2_values)
71
 
72
  # Clase para el análisis de teoría de grafos
73
  class GraphTheoryAnalysis:
@@ -83,12 +84,19 @@ class GraphTheoryAnalysis:
83
  if level > len(self.all_factors):
84
  level = len(self.all_factors) # Ajustar el nivel al número de factores disponibles
85
 
86
- for pair in combinations(self.all_factors, level):
87
- if len(pair) >= 2: # Asegurarse de que hay suficientes elementos para formar un par
88
- self.experiment.set_active_factors(list(pair))
89
- self.experiment.fit_models()
90
- r2 = (self.experiment.r2_variable1 + self.experiment.r2_variable2) / 2
91
- self.graph.add_edge(pair[0], pair[1], weight=r2)
 
 
 
 
 
 
 
92
 
93
  def visualize_graph(self, style='Style 1'):
94
  pos = nx.spring_layout(self.graph)
@@ -190,7 +198,6 @@ def analyze_design(level, pb_design, bb_design, variable1_values, variable2_valu
190
  graph_image_path = optimizer.visualize_graph(style=style)
191
 
192
  # Identificar los 3 factores más activos basados en R²
193
- # Aquí simplificamos tomando los factores con mayores R²
194
  factor_r2 = {}
195
  for factor in experiment.factor_values.keys():
196
  # Filtrar las aristas que contienen el factor
@@ -212,12 +219,30 @@ def analyze_design(level, pb_design, bb_design, variable1_values, variable2_valu
212
  # Crear dataframe de resultados
213
  bb_results = []
214
  for i, design in enumerate(bb_design_3f):
215
- row = {**design}
216
  row['Response 1'] = round(simulated_response1[i], 3)
217
  row['Response 2'] = round(simulated_response2[i], 3)
218
  bb_results.append(row)
219
 
220
- return graph_image_path, bb_design, gr.Dataframe.update(value=bb_results)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
 
222
  # Matriz Plackett-Burman (por defecto)
223
  default_pb_design = [
@@ -309,8 +334,8 @@ interface = gr.Interface(
309
  ],
310
  outputs=[
311
  gr.Image(label="Grafo de Relaciones entre Factores"),
312
- gr.Dataframe(headers=["X1", "X2", "X3", "X4"], label="Matriz Box-Behnken Editada"),
313
- gr.Dataframe(headers=["X1", "X2", "X3", "Response 1", "Response 2"], label="Datos Simulados para Box-Behnken")
314
  ],
315
  title="Análisis de Teoría de Grafos para Diseño Experimental",
316
  description="Analiza y visualiza las relaciones entre factores en un diseño experimental usando teoría de grafos. Además, genera y presenta datos simulados para un diseño Box-Behnken de 3 factores."
 
11
  from sklearn.metrics import r2_score
12
  from itertools import combinations
13
  import tempfile
14
+ import pandas as pd
15
 
16
  # Clase para el modelo de regresión
17
  class RegressionModel:
 
28
  X_poly = self.poly.transform(X)
29
  return self.model.predict(X_poly)
30
 
31
+ def r2_score_calc(self, X, y):
32
  y_pred = self.predict(X)
33
  return r2_score(y, y_pred)
34
 
 
67
  self.model_variable1.fit(X, self.variable1_values)
68
  self.model_variable2.fit(X, self.variable2_values)
69
 
70
+ self.r2_variable1 = self.model_variable1.r2_score_calc(X, self.variable1_values)
71
+ self.r2_variable2 = self.model_variable2.r2_score_calc(X, self.variable2_values)
72
 
73
  # Clase para el análisis de teoría de grafos
74
  class GraphTheoryAnalysis:
 
84
  if level > len(self.all_factors):
85
  level = len(self.all_factors) # Ajustar el nivel al número de factores disponibles
86
 
87
+ for combo in combinations(self.all_factors, level):
88
+ if len(combo) >= 2: # Asegurarse de que hay suficientes elementos para formar pares
89
+ # Crear todos los pares posibles dentro de la combinación
90
+ for pair in combinations(combo, 2):
91
+ self.experiment.set_active_factors(list(pair))
92
+ self.experiment.fit_models()
93
+ r2 = (self.experiment.r2_variable1 + self.experiment.r2_variable2) / 2
94
+ if self.graph.has_edge(pair[0], pair[1]):
95
+ # Si la arista ya existe, tomar el valor máximo de R²
96
+ existing_r2 = self.graph[pair[0]][pair[1]]['weight']
97
+ self.graph[pair[0]][pair[1]]['weight'] = max(existing_r2, r2)
98
+ else:
99
+ self.graph.add_edge(pair[0], pair[1], weight=r2)
100
 
101
  def visualize_graph(self, style='Style 1'):
102
  pos = nx.spring_layout(self.graph)
 
198
  graph_image_path = optimizer.visualize_graph(style=style)
199
 
200
  # Identificar los 3 factores más activos basados en R²
 
201
  factor_r2 = {}
202
  for factor in experiment.factor_values.keys():
203
  # Filtrar las aristas que contienen el factor
 
219
  # Crear dataframe de resultados
220
  bb_results = []
221
  for i, design in enumerate(bb_design_3f):
222
+ row = design.copy()
223
  row['Response 1'] = round(simulated_response1[i], 3)
224
  row['Response 2'] = round(simulated_response2[i], 3)
225
  bb_results.append(row)
226
 
227
+ # Convertir bb_design_used a DataFrame para mostrar
228
+ if level == 3:
229
+ # Diseño generado dinámicamente para los 3 factores más relevantes
230
+ bb_design_used = bb_design_3f
231
+ headers = top_factors + ['Response 1', 'Response 2']
232
+ else:
233
+ # Usar el diseño Box-Behnken ingresado por el usuario para 4 factores
234
+ bb_design_used = []
235
+ for row in bb_design:
236
+ design_row = { 'X1': row[0], 'X2': row[1], 'X3': row[2], 'X4': row[3] }
237
+ bb_design_used.append(design_row)
238
+ headers = ['X1', 'X2', 'X3', 'X4', 'Response 1', 'Response 2']
239
+
240
+ # Crear DataFrame para la matriz Box-Behnken usada
241
+ df_bb_used = pd.DataFrame(bb_design_used)
242
+ # Agregar respuestas al DataFrame
243
+ df_bb_used[['Response 1', 'Response 2']] = pd.DataFrame(bb_results)[['Response 1', 'Response 2']]
244
+
245
+ return graph_image_path, df_bb_used, df_bb_used
246
 
247
  # Matriz Plackett-Burman (por defecto)
248
  default_pb_design = [
 
334
  ],
335
  outputs=[
336
  gr.Image(label="Grafo de Relaciones entre Factores"),
337
+ gr.Dataframe(label="Matriz Box-Behnken Usada"),
338
+ gr.Dataframe(label="Datos Simulados para Box-Behnken")
339
  ],
340
  title="Análisis de Teoría de Grafos para Diseño Experimental",
341
  description="Analiza y visualiza las relaciones entre factores en un diseño experimental usando teoría de grafos. Además, genera y presenta datos simulados para un diseño Box-Behnken de 3 factores."