O que é aprendizado de parâmetros?
Aprendizado de parâmetros é o processo de estimar os valores numéricos das probabilidades condicionais em uma rede bayesiana. Dada a estrutura do grafo, ele usa os dados para preencher as tabelas CPT (probabilidades condicionais). Existem duas abordagens principais: máxima verossimilhança (ML) e máxima a posteriori (MAP). ML estima os parâmetros que maximizam a verossimilhança dos dados observados. MAP incorpora um prior sobre os parâmetros, regularizando as estimativas. ML é equivalente a contar frequências e normalizar (para variáveis discretas). MAP usa suavização (ex.: Laplace) para evitar probabilidades zero em combinações não vistas. O aprendizado de parâmetros é feito separadamente para cada nó, dado seus pais. Ele é computacionalmente simples e pode ser feito de forma incremental.
Características da estimação por máxima verossimilhança (ML)
O método ML possui três características principais que o definem. Primeiro, ele é consistente: converge para o valor verdadeiro com muitos dados. Segundo, ele é não-viesado assintoticamente para modelos corretamente especificados. Terceiro, ele pode superajustar dados pequenos, atribuindo probabilidade zero a eventos não observados. A estimativa ML para uma variável discreta com pais é a frequência relativa: P(X=x | pais=p) = contagem(x,p) / contagem(p). Ele é o estimador de escolha quando se tem muitos dados e nenhum conhecimento prévio.
Características da estimação por máxima a posteriori (MAP)
O método MAP também possui três características principais. Primeiro, ele incorpora um prior que suaviza as estimativas (ex.: Laplace, Dirichlet). Segundo, ele reduz o overfitting em dados escassos. Terceiro, ele é um compromisso entre os dados e a crença prévia. MAP equivale a adicionar pseudocontagens ao numerador e denominador. Para prior de Laplace (aditivo-1), P(X=x | pais=p) = (contagem(x,p) + 1) / (contagem(p) + k), onde k é o número de valores de X.
Vantagens e aplicações típicas
A principal vantagem do ML é a simplicidade e a objetividade. MAP é preferível quando os dados são escassos ou há conhecimento especialista. Ambos são usados em diagnóstico, classificação e sistemas de recomendação.
O aprendizado de parâmetros é a segunda etapa após a definição da estrutura. Em redes com muitas variáveis, as CPTs podem ser enormes (exponencial nos pais). Para reduzir a complexidade, usa-se modelos de regressão logística ou árvores de decisão. ML pode ser calculado por fechamento analítico para distribuições da família exponencial. MAP com prior Dirichlet é conjugado para distribuições multinomiais (discretas). A força do prior (tamanho da amostra virtual) controla a regularização. Prior fraco (ex.: pseudocontagens pequenas) aproxima o ML. Prior forte força as estimativas a ficarem próximas do prior. Em problemas contínuos, ML e MAP estimam médias e variâncias de distribuições normais. MAP é frequentemente usado em aprendizado de máquina com regularização L2 (equivalente a prior normal). A escolha entre ML e MAP depende do tamanho da amostra e da confiança no prior. Em dados grandes, ML e MAP convergem para o mesmo valor. O aprendizado de parâmetros pode ser feito online (atualização recursiva) com priores conjugados. Assim, o aprendizado de parâmetros é uma etapa fundamental em modelagem probabilística.
Um exemplo clássico é estimar a probabilidade de uma moeda dar cara. ML estima P(cara) = número de caras / total de lançamentos. MAP com prior Beta(α, β) estima (caras + α – 1) / (total + α + β – 2). Com poucos lançamentos, MAP puxa a estimativa para a média do prior.
Enunciado do exemplo clássico
Implemente o aprendizado de parâmetros ML e MAP para uma rede com uma variável binária X e um pai Y (também binário). Dados: 100 observações com contagens: Y=0 (40 vezes), Y=1 (60 vezes). Dentro de Y=0: X=0 (30), X=1 (10). Dentro de Y=1: X=0 (20), X=1 (40). Calcule as CPTs por ML e MAP (usando prior Beta(2,2) para cada condicional). Plote as estimativas e compare com as probabilidades verdadeiras (se conhecidas).
|
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 |
import numpy as np import matplotlib.pyplot as plt # Dados sintéticos (contagens) # Y=0: 40 amostras, X=0:30, X=1:10 # Y=1: 60 amostras, X=0:20, X=1:40 contagens = { (0,0): 30, # Y=0, X=0 (0,1): 10, # Y=0, X=1 (1,0): 20, # Y=1, X=0 (1,1): 40 # Y=1, X=1 } total_Y0 = 40 total_Y1 = 60 # Estimativa ML P_X_dado_Y_ML = { (0,0): contagens[(0,0)] / total_Y0, (0,1): contagens[(0,1)] / total_Y0, (1,0): contagens[(1,0)] / total_Y1, (1,1): contagens[(1,1)] / total_Y1 } # Estimativa MAP com prior Beta(2,2) (α=2, β=2) # Fórmula: (contagem + α - 1) / (total + α + β - 2) # Para Beta(2,2), α-1=1, α+β-2=2 alpha_beta = 2 pseudo = alpha_beta - 1 # = 1 denom_ajuste = 2 * pseudo # = 2 (pois α+β-2 = 2) P_X_dado_Y_MAP = { (0,0): (contagens[(0,0)] + pseudo) / (total_Y0 + denom_ajuste), (0,1): (contagens[(0,1)] + pseudo) / (total_Y0 + denom_ajuste), (1,0): (contagens[(1,0)] + pseudo) / (total_Y1 + denom_ajuste), (1,1): (contagens[(1,1)] + pseudo) / (total_Y1 + denom_ajuste) } # Probabilidades verdadeiras (geradas de forma arbitrária para comparação) verdade = { (0,0): 0.75, # P(X=0 | Y=0) (0,1): 0.25, # P(X=1 | Y=0) (1,0): 0.35, # P(X=0 | Y=1) (1,1): 0.65 # P(X=1 | Y=1) } print("Estimativas ML:") for (y,x), p in P_X_dado_Y_ML.items(): print(f" P(X={x} | Y={y}) = {p:.3f}") print("\nEstimativas MAP (Beta(2,2)):") for (y,x), p in P_X_dado_Y_MAP.items(): print(f" P(X={x} | Y={y}) = {p:.3f}") print("\nValores verdadeiros (para referência):") for (y,x), p in verdade.items(): print(f" P(X={x} | Y={y}) = {p:.3f}") # Gráficos y_vals = [0, 1] x_vals = [0, 1] bar_width = 0.2 pos = np.arange(len(y_vals)) fig, axes = plt.subplots(1, 2, figsize=(12, 5)) # Para Y=0 ax = axes[0] ml_0 = [P_X_dado_Y_ML[(0,0)], P_X_dado_Y_ML[(0,1)]] map_0 = [P_X_dado_Y_MAP[(0,0)], P_X_dado_Y_MAP[(0,1)]] verdade_0 = [verdade[(0,0)], verdade[(0,1)]] ax.bar(pos - bar_width, ml_0, width=bar_width, label='ML', color='blue') ax.bar(pos, map_0, width=bar_width, label='MAP', color='green') ax.bar(pos + bar_width, verdade_0, width=bar_width, label='Verdade', color='red', alpha=0.6) ax.set_xticks(pos) ax.set_xticklabels(['X=0', 'X=1']) ax.set_ylabel('Probabilidade') ax.set_title('P(X | Y=0)') ax.legend() ax.grid(True, axis='y', linestyle='--') # Para Y=1 ax = axes[1] ml_1 = [P_X_dado_Y_ML[(1,0)], P_X_dado_Y_ML[(1,1)]] map_1 = [P_X_dado_Y_MAP[(1,0)], P_X_dado_Y_MAP[(1,1)]] verdade_1 = [verdade[(1,0)], verdade[(1,1)]] ax.bar(pos - bar_width, ml_1, width=bar_width, label='ML', color='blue') ax.bar(pos, map_1, width=bar_width, label='MAP', color='green') ax.bar(pos + bar_width, verdade_1, width=bar_width, label='Verdade', color='red', alpha=0.6) ax.set_xticks(pos) ax.set_xticklabels(['X=0', 'X=1']) ax.set_ylabel('Probabilidade') ax.set_title('P(X | Y=1)') ax.legend() ax.grid(True, axis='y', linestyle='--') plt.tight_layout() plt.show() # Análise de sensibilidade: variando a força do prior forcas = [1, 2, 5, 10] # α = β = forca fig2, ax2 = plt.subplots(figsize=(8, 5)) for f in forcas: pseudo_f = f - 1 denom_f = 2 * pseudo_f p_map = (contagens[(0,1)] + pseudo_f) / (total_Y0 + denom_f) ax2.scatter(f, p_map, label=f'α=β={f}', s=80) ax2.axhline(P_X_dado_Y_ML[(0,1)], color='blue', linestyle='--', label='ML') ax2.axhline(verdade[(0,1)], color='red', linestyle=':', label='Verdadeiro') ax2.set_xlabel('Força do prior (α=β)') ax2.set_ylabel('P(X=1 | Y=0) estimado') ax2.set_title('Sensibilidade MAP à Força do Prior') ax2.legend() ax2.grid(True) plt.tight_layout() plt.show() |
Este código estima parâmetros por ML e MAP para uma CPT simples. ML segue as frequências exatas dos dados, podendo ser instável com amostras pequenas. MAP suaviza as estimativas, puxando-as em direção à probabilidade uniforme (0.5). Quanto maior a força do prior, mais as estimativas se afastam dos dados. Para iniciantes, este exemplo mostra a diferença prática entre ML e MAP. O aprendizado de parâmetros é, portanto, uma escolha entre objetividade e regularização.