Update app.py
Browse files
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
|
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.
|
70 |
-
self.r2_variable2 = self.model_variable2.
|
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
|
87 |
-
if len(
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 =
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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(
|
313 |
-
gr.Dataframe(
|
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."
|