import gradio as gr import numpy as np import matplotlib.pyplot as plt from matplotlib_venn import venn2 # 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): # Calculamos P(B) usando la regla de la probabilidad total prob_B = prob_B_given_A * prior_A + prob_B_given_notA * (1 - prior_A) # Calculamos P(A|B) usando el teorema de Bayes posterior_A_given_B = (prob_B_given_A * prior_A) / prob_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): # Calculamos las áreas relativas del diagrama de Venn 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=('A', 'B'), ax=ax) ax.set_title('Diagrama de Venn de Eventos 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) # Retornar el diagrama de Venn y los resultados return fig_venn, f"P(B): {prob_B:.4f}", f"P(A|B): {posterior_A_given_B:.4f}" # Función para múltiples eventos def bayes_multiple_events(priors, likelihoods): priors = np.array(priors) likelihoods = np.array(likelihoods) # Calculamos P(B) usando la regla de la probabilidad total prob_B = np.sum(priors * likelihoods) # Calculamos las probabilidades posteriores P(Ai|B) para cada evento Ai posteriors = (priors * likelihoods) / prob_B return posteriors, prob_B # Función para crear gráficos de barras para múltiples eventos def plot_results_multiple_events(priors, likelihoods, posteriors): events = [f'A{i+1}' for i in range(len(priors))] fig, ax = plt.subplots() ax.bar(events, posteriors, color='purple') 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_results_multiple_events(priors, likelihoods, posteriors) resultados = "\n".join([f"P(A{i+1}|B): {posterior:.4f}" for i, posterior in enumerate(posteriors)]) return fig, f"P(B): {prob_B:.4f}", 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()