import gradio as gr import numpy as np import matplotlib.pyplot as plt # 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 gráfico de barras def plot_results_two_events(prior_A, prob_B_given_A, prob_B_given_notA, posterior_A_given_B): # Crear un gráfico de barras para las probabilidades labels = ['P(A)', 'P(B|A)', 'P(B|¬A)', 'P(A|B)'] values = [prior_A, prob_B_given_A, prob_B_given_notA, posterior_A_given_B] fig, ax = plt.subplots() ax.bar(labels, values, color=['skyblue', 'orange', 'lightgreen', 'pink']) ax.set_ylabel('Probabilidad') ax.set_title('Resultados del Teorema de Bayes') 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 = plot_results_two_events(prior_A, prob_B_given_A, prob_B_given_notA, posterior_A_given_B) # Retornar la figura y los resultados return fig, 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 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 with gr.Blocks() as demo: with gr.Tab("Dos Eventos"): gr.Markdown("## Calculadora Simple del Teorema de Bayes para Dos Eventos") 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) 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=[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()