Spaces:
Sleeping
Sleeping
File size: 6,665 Bytes
1993bab dd8476a 1993bab 138423f dd8476a 1993bab 29309e0 2568eea 1993bab 2568eea 41ec72f 1993bab 138423f 2568eea fd5d540 138423f 29309e0 dd8476a 29309e0 dd8476a 41ec72f dd8476a 29309e0 dd8476a fd5d540 dd8476a 41ec72f dd8476a fd5d540 dd8476a fd5d540 dd8476a 29309e0 41ec72f 29309e0 fd5d540 29309e0 138423f 2568eea 08db38d 2568eea 08db38d 2568eea 08db38d 138423f 2568eea 138423f fd5d540 29309e0 138423f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
from matplotlib_venn import venn2, venn3
# Función para calcular el teorema de Bayes con dos eventos
def bayes_two_events(prior_A, prob_B_given_A, prob_B_given_notA):
prob_B = prob_B_given_A * prior_A + prob_B_given_notA * (1 - prior_A) # Calculamos P(B)
posterior_A_given_B = (prob_B_given_A * prior_A) / prob_B # Calculamos P(A|B)
return posterior_A_given_B, prob_B
# Función para crear el diagrama de Venn para dos eventos
def plot_venn(prior_A, prob_B_given_A, prob_B_given_notA):
area_A = prior_A
area_B = prob_B_given_A * prior_A + prob_B_given_notA * (1 - prior_A)
area_AB = prob_B_given_A * prior_A
fig, ax = plt.subplots()
venn = venn2(subsets=(area_A, area_B - area_AB, area_AB), set_labels=('Evento A', 'Evento B'), ax=ax)
venn.get_label_by_id('10').set_text(f'P(A) = {prior_A:.2f}')
venn.get_label_by_id('01').set_text(f'P(B | ¬A) = {prob_B_given_notA:.2f}')
venn.get_label_by_id('11').set_text(f'P(B | A) = {prob_B_given_A:.2f}')
ax.set_title('Diagrama de Venn: Relaciones entre A y B')
return fig
# Función principal para dos eventos
def bayes_app_two_events(prior_A, prob_B_given_A, prob_B_given_notA):
posterior_A_given_B, prob_B = bayes_two_events(prior_A, prob_B_given_A, prob_B_given_notA)
fig_venn = plot_venn(prior_A, prob_B_given_A, prob_B_given_notA)
return fig_venn, f"P(B): {prob_B:.2f}", f"P(A|B): {posterior_A_given_B:.2f}"
# Función para múltiples eventos
def bayes_multiple_events(priors, likelihoods):
priors = np.array(priors)
likelihoods = np.array(likelihoods)
prob_B = np.sum(priors * likelihoods) # Calculamos P(B)
posteriors = (priors * likelihoods) / prob_B # Calculamos las probabilidades posteriores P(Ai|B) para cada evento Ai
return posteriors, prob_B
# Función para crear diagramas de Venn o gráficos de partición para múltiples eventos
def plot_sets_multiple_events(priors, likelihoods, posteriors):
num_events = len(priors)
if num_events == 2:
# Diagrama de Venn para 2 eventos
fig, ax = plt.subplots()
venn = venn2(subsets=(priors[0], priors[1], likelihoods[0] * priors[0]), set_labels=('Evento A1', 'Evento A2'), ax=ax)
venn.get_label_by_id('10').set_text(f'P(A1) = {priors[0]:.2f}')
venn.get_label_by_id('01').set_text(f'P(A2) = {priors[1]:.2f}')
venn.get_label_by_id('11').set_text(f'P(B|A1) = {likelihoods[0]:.2f}')
ax.set_title('Diagrama de Venn para 2 Eventos')
return fig
elif num_events == 3:
# Diagrama de Venn para 3 eventos
fig, ax = plt.subplots()
venn = venn3(subsets=(priors[0], priors[1], likelihoods[0] * priors[0], priors[2], likelihoods[1] * priors[1], likelihoods[2] * priors[2], likelihoods[0] * likelihoods[1] * priors[0]), set_labels=('Evento A1', 'Evento A2', 'Evento A3'), ax=ax)
venn.get_label_by_id('100').set_text(f'P(A1) = {priors[0]:.2f}')
venn.get_label_by_id('010').set_text(f'P(A2) = {priors[1]:.2f}')
venn.get_label_by_id('001').set_text(f'P(A3) = {priors[2]:.2f}')
venn.get_label_by_id('110').set_text(f'P(B|A1 ∩ A2) = {likelihoods[0] * likelihoods[1]:.2f}')
venn.get_label_by_id('011').set_text(f'P(B|A2 ∩ A3) = {likelihoods[1] * likelihoods[2]:.2f}')
venn.get_label_by_id('101').set_text(f'P(B|A1 ∩ A3) = {likelihoods[0] * likelihoods[2]:.2f}')
venn.get_label_by_id('111').set_text(f'P(B|A1 ∩ A2 ∩ A3) = {likelihoods[0] * likelihoods[1] * likelihoods[2]:.2f}')
ax.set_title('Diagrama de Venn para 3 Eventos')
return fig
else:
# Gráfico de partición para más de 3 eventos
events = [f'A{i+1}' for i in range(num_events)]
fig, ax = plt.subplots()
ax.bar(events, posteriors, color='purple')
for i, posterior in enumerate(posteriors):
ax.text(i, posterior / 2, f'P(A{i+1}|B) = {posterior:.2f}', ha='center', va='center', color='white')
ax.set_ylabel('Probabilidad Posterior')
ax.set_title('Resultados del Teorema de Bayes para Múltiples Eventos')
return fig
# Función principal para múltiples eventos
def bayes_app_multiple_events(priors, likelihoods):
priors = list(map(float, priors.split(',')))
likelihoods = list(map(float, likelihoods.split(',')))
posteriors, prob_B = bayes_multiple_events(priors, likelihoods)
fig = plot_sets_multiple_events(priors, likelihoods, posteriors)
resultados = "\n".join([f"P(A{i+1}|B): {posterior:.2f}" for i, posterior in enumerate(posteriors)])
return fig, f"P(B): {prob_B:.2f}", resultados
# Crear la interfaz de Gradio con dos pestañas
with gr.Blocks() as demo:
with gr.Tab("Dos Eventos"):
gr.Markdown("## Calculadora del Teorema de Bayes con Diagrama de Venn")
gr.Markdown("Ajusta los valores de probabilidad para calcular la probabilidad de A dado B (P(A|B)).")
prior_A = gr.Slider(0, 1, step=0.01, label="Probabilidad Inicial de A (P(A))", value=0.5)
prob_B_given_A = gr.Slider(0, 1, step=0.01, label="Probabilidad de B dado A (P(B|A))", value=0.7)
prob_B_given_notA = gr.Slider(0, 1, step=0.01, label="Probabilidad de B dado que no ocurre A (P(B|¬A))", value=0.2)
venn_plot = gr.Plot()
prob_B = gr.Textbox(label="Probabilidad de B (P(B))")
prob_A_given_B = gr.Textbox(label="Probabilidad de A dado B (P(A|B))")
btn = gr.Button("Calcular")
btn.click(fn=bayes_app_two_events, inputs=[prior_A, prob_B_given_A, prob_B_given_notA], outputs=[venn_plot, prob_B, prob_A_given_B])
with gr.Tab("Múltiples Eventos"):
gr.Markdown("## Calculadora del Teorema de Bayes para Múltiples Eventos")
gr.Markdown("Introduce las probabilidades de los eventos iniciales (Priors) y las probabilidades condicionales de B dado cada evento (Likelihoods) separadas por comas. Ejemplo: '0.2, 0.3, 0.5' para tres eventos.")
priors_input = gr.Textbox(label="Priors (Probabilidades Iniciales)", placeholder="Ejemplo: 0.2, 0.3, 0.5")
likelihoods_input = gr.Textbox(label="Likelihoods (Probabilidades Condicionales de B dado cada evento)", placeholder="Ejemplo: 0.6, 0.7, 0.4")
plot_multi = gr.Plot()
prob_B_multi = gr.Textbox(label="Probabilidad de B (P(B))")
posteriors = gr.Textbox(label="Probabilidades Posteriores")
btn_multi = gr.Button("Calcular")
btn_multi.click(fn=bayes_app_multiple_events, inputs=[priors_input, likelihoods_input], outputs=[plot_multi, prob_B_multi, posteriors])
demo.launch()
|