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()