O que é aprendizado bayesiano?
Aprendizado bayesiano é o processo de atualizar crenças sobre parâmetros ou modelos usando dados observados. Ele combina conhecimento prévio (prior) com a verossimilhança dos dados para obter a distribuição a posteriori. Diferentemente do aprendizado frequencista, ele produz distribuições completas, não estimativas pontuais. O aprendizado é sequencial: a cada novo dado, a posteriori vira o novo prior. Isso permite adaptação contínua e online, sem necessidade de reprocessar todo o histórico. O aprendizado bayesiano também fornece medidas de incerteza (intervalos de credibilidade). Ele é usado em regressão, classificação, agrupamento e seleção de modelos. A abordagem é naturalmente regularizada, evitando overfitting em dados pequenos.
Características fundamentais do aprendizado bayesiano
O aprendizado bayesiano possui três características principais que o distinguem. Primeiro, ele trata todos os parâmetros como variáveis aleatórias com distribuições. Segundo, ele usa o teorema de Bayes como única regra de atualização. Terceiro, ele permite a comparação formal de modelos via fator de Bayes. O aprendizado é baseado em inferência, não em otimização de uma função de perda. Ele incorpora automaticamente o princípio da navalha de Occam (modelos mais simples têm prior maior).
Vantagens e aplicações típicas
A principal vantagem é a robustez a dados escassos e a incerteza quantificada. Ele é usado em medicina, finanças, climatologia e aprendizado de máquina. Também é aplicado em sistemas de recomendação e análise de sobrevivência. Contudo, o custo computacional pode ser alto para modelos complexos.
O aprendizado bayesiano é a base de métodos como regressão linear bayesiana e redes neurais bayesianas. Na regressão linear, a posteriori dos coeficientes é uma distribuição normal (com prior normal conjugado). A predição é feita integrando a incerteza dos coeficientes, resultando em intervalos de previsão. A seleção de modelos é feita por comparação de evidências (verossimilhança marginal). O fator de Bayes é a razão entre as evidências de dois modelos concorrentes. Ele penaliza modelos desnecessariamente complexos, evitando overfitting. O aprendizado bayesiano também é usado em otimização de hiperparâmetros (otimização bayesiana). A cada iteração, um modelo substituto (ex.: Gaussian Process) guia a busca. Em redes neurais, o aprendizado bayesiano (via MCMC ou variação) fornece incerteza nas previsões. Isso é crucial para sistemas de segurança críticos (ex.: veículos autônomos). O aprendizado bayesiano também permite aprendizado ativo: escolher quais dados rotular. A aquisição de dados é guiada pela redução esperada da incerteza. Ele também é usado em aprendizado por reforço para explorar com confiança. Assim, o aprendizado bayesiano é um paradigma flexível e poderoso para ciência de dados.
Um exemplo clássico é a regressão linear com dados de temperatura. Prior nos coeficientes é normal com média zero (regularização). Dados observados atualizam a posteriori, que prediz novas temperaturas com intervalo de credibilidade. O aprendizado bayesiano mostra como a incerteza diminui com mais dados.
Enunciado do exemplo clássico
Implemente a regressão linear bayesiana com prior normal conjugado para um conjunto sintético. Dados: y = 2*x + 1 + ruído N(0, 0.5) para x em [0, 5] com 30 pontos. Prior: coeficiente (inclinação) ~ N(0, 10), intercepto ~ N(0, 10). Calcule a distribuição a posteriori dos coeficientes e faça predições com intervalos de credibilidade. Plote os dados, a reta verdadeira, a predição média e a banda de 95% de credibilidade.
|
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 |
import numpy as np import matplotlib.pyplot as plt from scipy.stats import multivariate_normal # Gerar dados sintéticos np.random.seed(42) n = 30 x = np.linspace(0, 5, n) erro = np.random.normal(0, 0.5, n) y_real = 2 * x + 1 y = y_real + erro # Regressão linear bayesiana com prior normal conjugado # Modelo: y = w0 + w1 * x + ruído, com precisão alpha = 1/sigma² # Prior: w ~ N(0, Sigma_prior) com Sigma_prior = diag(10, 10) # Construir matriz de design (coluna de 1s para intercepto) X = np.vstack([np.ones(n), x]).T # Parâmetros alpha = 1.0 / (0.5**2) # precisão do ruído (conhecida) Sigma_prior = np.diag([10.0, 10.0]) mu_prior = np.array([0.0, 0.0]) # Posteriori: w | dados ~ N(mu_post, Sigma_post) Sigma_post = np.linalg.inv(Sigma_prior + alpha * X.T @ X) mu_post = Sigma_post @ (np.linalg.inv(Sigma_prior) @ mu_prior + alpha * X.T @ y) print("Média a posteriori dos coeficientes:") print(f" Intercepto: {mu_post[0]:.3f}") print(f" Inclinação: {mu_post[1]:.3f}") print("\nMatriz de covariância a posteriori:") print(Sigma_post) # Predição para novos pontos (x_test) x_test = np.linspace(-0.5, 5.5, 100) X_test = np.vstack([np.ones(len(x_test)), x_test]).T # Média preditiva y_pred_mean = X_test @ mu_post # Variância preditiva: var(y_pred) = X_test @ Sigma_post @ X_test.T + 1/alpha # (inclui incerteza dos coeficientes + ruído) var_pred = np.diag(X_test @ Sigma_post @ X_test.T) + 1/alpha std_pred = np.sqrt(var_pred) # Intervalos de credibilidade de 95% lim_inf = y_pred_mean - 1.96 * std_pred lim_sup = y_pred_mean + 1.96 * std_pred # Gráficos plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) plt.scatter(x, y, color='blue', label='Dados observados') plt.plot(x_test, 2*x_test + 1, 'g-', linewidth=2, label='Verdade: y=2x+1') plt.plot(x_test, y_pred_mean, 'r-', linewidth=2, label='Predição bayesiana (média)') plt.fill_between(x_test, lim_inf, lim_sup, color='red', alpha=0.2, label='IC 95%') plt.xlabel('x') plt.ylabel('y') plt.title('Regressão Linear Bayesiana') plt.legend() plt.grid(True) plt.subplot(1, 2, 2) # Mostrar a distribuição a posteriori dos coeficientes # Amostrar da posteriori para visualização amostras = multivariate_normal.rvs(mu_post, Sigma_post, size=200) plt.scatter(amostras[:,0], amostras[:,1], alpha=0.3, s=10, label='Amostras da posteriori') plt.scatter(mu_post[0], mu_post[1], color='red', s=80, label='Média posteriori') plt.scatter(0, 2, color='green', s=80, marker='*', label='Valor verdadeiro (1,2)') plt.xlabel('Intercepto (w0)') plt.ylabel('Inclinação (w1)') plt.title('Distribuição a Posteriori dos Coeficientes') plt.legend() plt.grid(True) plt.tight_layout() plt.show() # Predição para um novo ponto x=3.5 x_novo = 3.5 X_novo = np.array([1, x_novo]) y_pred_novo = X_novo @ mu_post var_novo = X_novo @ Sigma_post @ X_novo.T + 1/alpha std_novo = np.sqrt(var_novo) print(f"\nPredição para x = {x_novo}:") print(f" y = {y_pred_novo:.3f} ± {1.96*std_novo:.3f} (95% IC)") |
Este código implementa a regressão linear bayesiana com prior conjugado. A média a posteriori dos coeficientes se aproxima dos valores verdadeiros (1,2). A banda de 95% de credibilidade captura a incerteza tanto dos coeficientes quanto do ruído. O gráfico de dispersão dos coeficientes mostra a correlação entre intercepto e inclinação. Para iniciantes, este exemplo demonstra o aprendizado bayesiano prático. O aprendizado bayesiano é, portanto, uma ferramenta poderosa para modelagem preditiva.