hedtorresca commited on
Commit
7f7b110
·
verified ·
1 Parent(s): 2ae0c12

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -90
app.py CHANGED
@@ -26,57 +26,6 @@ def validate_inputs(A, B, C, AB, AC, BC, ABC, U):
26
 
27
  return errors
28
 
29
- def bayes_theorem(P_prior, P_likelihood, P_marginal):
30
- return (P_likelihood * P_prior) / P_marginal
31
-
32
- def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
33
- # Probabilidades individuales
34
- P_A = A / U
35
- P_B = B / U
36
- P_C = C / U
37
-
38
- # Probabilidades condicionales
39
- P_A_given_B = AB / B
40
- P_B_given_A = AB / A
41
- P_A_given_C = AC / C
42
- P_C_given_A = AC / A
43
- P_B_given_C = BC / C
44
- P_C_given_B = BC / B
45
-
46
- # Probabilidad total para A, B y C
47
- P_A_total = P_B * P_A_given_B + P_C * P_A_given_C - P_B_given_C * P_C_given_B * P_A_given_B * P_A_given_C
48
- P_B_total = P_A * P_B_given_A + P_C * P_B_given_C - P_A_given_C * P_C_given_A * P_B_given_A * P_B_given_C
49
- P_C_total = P_A * P_C_given_A + P_B * P_C_given_B - P_A_given_B * P_B_given_A * P_C_given_A * P_C_given_B
50
-
51
- # Teorema de Bayes (dinámico)
52
- P_A_given_B_bayes = bayes_theorem(P_A, P_B_given_A, P_B)
53
- P_B_given_A_bayes = bayes_theorem(P_B, P_A_given_B, P_A)
54
- P_A_given_C_bayes = bayes_theorem(P_A, P_C_given_A, P_C)
55
- P_C_given_A_bayes = bayes_theorem(P_C, P_A_given_C, P_A)
56
- P_B_given_C_bayes = bayes_theorem(P_B, P_C_given_B, P_C)
57
- P_C_given_B_bayes = bayes_theorem(P_C, P_B_given_C, P_B)
58
-
59
- return {
60
- "P(A)": P_A,
61
- "P(B)": P_B,
62
- "P(C)": P_C,
63
- "P(A|B)": P_A_given_B,
64
- "P(B|A)": P_B_given_A,
65
- "P(A|C)": P_A_given_C,
66
- "P(C|A)": P_C_given_A,
67
- "P(B|C)": P_B_given_C,
68
- "P(C|B)": P_C_given_B,
69
- "P(A) total": P_A_total,
70
- "P(B) total": P_B_total,
71
- "P(C) total": P_C_total,
72
- "P(A|B) Bayes": P_A_given_B_bayes,
73
- "P(B|A) Bayes": P_B_given_A_bayes,
74
- "P(A|C) Bayes": P_A_given_C_bayes,
75
- "P(C|A) Bayes": P_C_given_A_bayes,
76
- "P(B|C) Bayes": P_B_given_C_bayes,
77
- "P(C|B) Bayes": P_C_given_B_bayes
78
- }
79
-
80
  def suggest_intersections(A, B, C, AB, AC, BC, ABC, U):
81
  union_ABC = A + B + C - AB - AC - BC + ABC
82
 
@@ -90,57 +39,109 @@ def suggest_intersections(A, B, C, AB, AC, BC, ABC, U):
90
  "Máximo valor sugerido para A ∩ B": max_AB,
91
  "Máximo valor sugerido para A ∩ C": max_AC,
92
  "Máximo valor sugerido para B ∩ C": max_BC,
93
- "Máximo valor sugerido para A ∩ B ∩ C": max_ABC
94
  }
95
-
96
  return suggestions
97
 
98
- def plot_venn(A, B, C, AB, AC, BC, ABC):
99
- plt.figure(figsize=(8,8))
100
- venn = venn3(subsets = (A, B, AB, C, AC, BC, ABC), set_labels=('A', 'B', 'C'))
101
- buf = BytesIO()
102
- plt.savefig(buf, format='png')
103
- plt.close()
104
- buf.seek(0)
105
- return Image.open(buf)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
- def main(A, B, C, AB, AC, BC, ABC, U):
108
- # Mostrar gráfico de Venn
109
- venn_img = plot_venn(A, B, C, AB, AC, BC, ABC)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
 
111
- # Validar entradas
112
- validation_errors = validate_inputs(A, B, C, AB, AC, BC, ABC, U)
113
- if validation_errors:
114
- return None, None, validation_errors
115
 
116
- # Sugerir intersecciones
117
- suggestions = suggest_intersections(A, B, C, AB, AC, BC, ABC, U)
 
 
 
 
 
 
 
 
 
 
 
118
 
119
- # Calcular probabilidades
120
- probabilities = calculate_probabilities(A, B, C, AB, AC, BC, ABC, U)
 
121
 
122
- return venn_img, suggestions, probabilities
123
 
124
- iface = gr.Interface(
125
- fn=main,
 
126
  inputs=[
127
- gr.Number(label="A"),
128
- gr.Number(label="B"),
129
- gr.Number(label="C"),
130
- gr.Number(label="A ∩ B"),
131
- gr.Number(label="A ∩ C"),
132
- gr.Number(label="B ∩ C"),
133
- gr.Number(label="A ∩ B ∩ C"),
134
- gr.Number(label="U")
135
- ],
136
  outputs=[
137
- gr.Image(type="pil"),
138
- gr.JSON(label="Sugerencias"),
139
- gr.JSON(label="Probabilidades")
140
  ],
141
- live=True, # Esta opción permite la actualización automática de resultados
142
- title="Cálculo de Probabilidades y Diagramas de Venn"
 
143
  )
144
 
145
  if __name__ == "__main__":
146
- iface.launch()
 
26
 
27
  return errors
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  def suggest_intersections(A, B, C, AB, AC, BC, ABC, U):
30
  union_ABC = A + B + C - AB - AC - BC + ABC
31
 
 
39
  "Máximo valor sugerido para A ∩ B": max_AB,
40
  "Máximo valor sugerido para A ∩ C": max_AC,
41
  "Máximo valor sugerido para B ∩ C": max_BC,
42
+ "Máximo valor sugerido para A ∩ B ∩ C": max_ABC,
43
  }
 
44
  return suggestions
45
 
46
+ def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
47
+ total = U if U > 0 else (A + B + C - AB - AC - BC + ABC)
48
+ if total == 0:
49
+ return {
50
+ "P(A)": 0,
51
+ "P(B)": 0,
52
+ "P(C)": 0,
53
+ "P(A ∩ B)": 0,
54
+ "P(A ∩ C)": 0,
55
+ "P(B ∩ C)": 0,
56
+ "P(A ∩ B ∩ C)": 0,
57
+ }
58
+
59
+ P_A = A / total
60
+ P_B = B / total
61
+ P_C = C / total
62
+ P_AB = AB / total
63
+ P_AC = AC / total
64
+ P_BC = BC / total
65
+ P_ABC = ABC / total
66
+
67
+ PA_given_B = P_AB / P_B if P_B > 0 else 0
68
+ PA_given_C = P_AC / P_C if P_C > 0 else 0
69
+ PB_given_C = P_BC / P_C if P_C > 0 else 0
70
+ PB_given_A = P_BA / P_A if P_A > 0 else 0
71
+ PC_given_A = P_CA / P_A if P_A > 0 else 0
72
+ PC_given_B = P_CB / P_B if P_B > 0 else 0
73
 
74
+ formatted_probs = {
75
+ "P(A)": f"{P_A:.2%} ({A}/{total})",
76
+ "P(B)": f"{P_B:.2%} ({B}/{total})",
77
+ "P(C)": f"{P_C:.2%} ({C}/{total})",
78
+ "P(A ∩ B)": f"{P_AB:.2%} ({AB}/{total})",
79
+ "P(A ∩ C)": f"{P_AC:.2%} ({AC}/{total})",
80
+ "P(B ∩ C)": f"{P_BC:.2%} ({BC}/{total})",
81
+ "P(A ∩ B ∩ C)": f"{P_ABC:.2%} ({ABC}/{total})",
82
+ "P(A | B)": f"{PA_given_B:.2%} (P(A ∩ B) / P(B)) = ({P_AB:.4f} / {P_B:.4f})",
83
+ "P(A | C)": f"{PA_given_C:.2%} (P(A ∩ C) / P(C)) = ({P_AC:.4f} / {P_C:.4f})",
84
+ "P(B | C)": f"{PB_given_C:.2%} (P(B ∩ C) / P(C)) = ({P_BC:.4f} / {P_C:.4f})",
85
+ "P(B | A)": f"{PB_given_C:.2%} (P(B ∩ A) / P(A)) = ({P_BA:.4f} / {P_A:.4f})",
86
+ "P(C | A)": f"{PC_given_A:.2%} (P(C ∩ A) / P(A)) = ({P_CA:.4f} / {P_A:.4f})",
87
+ "P(C | B)": f"{PC_given_B:.2%} (P(C ∩ B) / P(B)) = ({P_CB:.4f} / {P_B:.4f})",
88
+ "P(B | A)": f"{P_B_given_A_bayes:.2%} (Teorema de Bayes: P(A | B) * P(B) / P(A)) = ({P_A_given_B:.4f} * {P_B:.4f} / {P_A:.4f})",
89
+ "P(A | B)": f"{P_A_given_B_bayes:.2%} (Teorema de Bayes: P(B | A) * P(A) / P(B)) = ({P_B_given_A:.4f} * {P_A:.4f} / {P_B:.4f})",
90
+ "P(C | A)": f"{P_C_given_A_bayes:.2%} (Teorema de Bayes: P(A | C) * P(C) / P(A)) = ({P_A_given_C:.4f} * {P_C:.4f} / {P_A:.4f})",
91
+ "P(A | C)": f"{P_A_given_C_bayes:.2%} (Teorema de Bayes: P(C | A) * P(A) / P(C)) = ({P_C_given_A:.4f} * {P_A:.4f} / {P_C:.4f})",
92
+ "P(C | B)": f"{P_C_given_B_bayes:.2%} (Teorema de Bayes: P(B | C) * P(C) / P(B)) = ({P_B_given_C:.4f} * {P_C:.4f} / {P_B:.4f})",
93
+ "P(B | C)": f"{P_B_given_C_bayes:.2%} (Teorema de Bayes: P(C | B) * P(B) / P(C)) = ({P_C_given_B:.4f} * {P_B:.4f} / {P_C:.4f})",
94
+
95
+ "U (Universal Set)": total,
96
+ "Complemento de A U B U C": U - (A + B + C - AB - AC - BC + ABC)
97
+ }
98
 
99
+ # Convert to DataFrame for better visualization
100
+ df = pd.DataFrame(list(formatted_probs.items()), columns=["Descripción", "Valor"])
101
+ return df
 
102
 
103
+ def draw_venn(A, B, C, AB, AC, BC, ABC):
104
+ plt.figure(figsize=(10,10))
105
+ venn = venn3(subsets=(max(0, A - AB - AC + ABC), max(0,B - AB - BC + ABC), max(0,AB - ABC), max(0,C- AC - BC + ABC), max(AC - ABC, 0), max(BC - ABC,0), ABC), set_labels=('A', 'B', 'C'))
106
+ img = BytesIO()
107
+ plt.savefig(img, format='png')
108
+ img.seek(0)
109
+ image = Image.open(img)
110
+ return image
111
+
112
+ def main(U, A, B, C, AB, AC, BC, ABC):
113
+ errors = validate_inputs(A, B, C, AB, AC, BC, ABC, U)
114
+ if errors:
115
+ return {"Errores de validación": errors}, None, None
116
 
117
+ suggestions = suggest_intersections(A, B, C, AB, AC, BC, ABC, U)
118
+ probabilities_df = calculate_probabilities(A, B, C, AB, AC, BC, ABC, U)
119
+ venn_image = draw_venn(A, B, C, AB, AC, BC, ABC)
120
 
121
+ return suggestions, probabilities_df, venn_image
122
 
123
+ # Gradio Interface
124
+ interface = gr.Interface(
125
+ fn=main,
126
  inputs=[
127
+ gr.Number(label="U (Universal Set)"),
128
+ gr.Number(label="A"),
129
+ gr.Number(label="B"),
130
+ gr.Number(label="C"),
131
+ gr.Number(label="A ∩ B"),
132
+ gr.Number(label="A ∩ C"),
133
+ gr.Number(label="B ∩ C"),
134
+ gr.Number(label="A ∩ B ∩ C")
135
+ ],
136
  outputs=[
137
+ gr.JSON(label="Sugerencias de Intersección"),
138
+ gr.Dataframe(label="Tabla de Probabilidades"),
139
+ gr.Image(type="pil", label="Diagrama de Venn")
140
  ],
141
+ title="Calculadora de Probabilidades y Diagrama de Venn",
142
+ description="Calcula las probabilidades, intersecciones sugeridas y genera un diagrama de Venn.",
143
+ live=True
144
  )
145
 
146
  if __name__ == "__main__":
147
+ interface.launch()