hedtorresca commited on
Commit
b0bc027
·
verified ·
1 Parent(s): 21cbe45

Update app.py

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