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