O que são redes bayesianas com variáveis contínuas?
Redes bayesianas com variáveis contínuas modelam relações probabilísticas entre variáveis numéricas reais. Cada nó representa uma variável que pode assumir qualquer valor em um intervalo. Diferentemente das discretas, as distribuições condicionais são funções densidade de probabilidade (PDFs). A forma mais comum é a distribuição normal (gaussiana) para cada nó. Nesse caso, a rede é chamada de rede bayesiana gaussiana (GBN). Cada nó tem uma média que é combinação linear dos pais e uma variância fixa. A distribuição conjunta é uma normal multivariada com estrutura de covariância esparsa. Isso permite inferência eficiente por álgebra linear, sem enumeração de casos. Portanto, redes contínuas são ideais para problemas de engenharia e finanças.
Características fundamentais
Essas redes possuem três características principais que as distinguem. Primeiro, as CPTs são substituídas por equações lineares com coeficientes de regressão. Segundo, a inferência exata é feita por eliminação gaussiana, que é polinomial. Terceiro, a aprendizagem de parâmetros usa estimativa de máxima verossimilhança ou bayesiana. A estrutura pode ser aprendida com algoritmos de busca usando critérios como BIC. Além disso, redes contínuas suportam variáveis latentes (não observadas) com integração analítica. A suposição de normalidade é forte, mas muitas vezes razoável na prática. Transformações como log ou Box-Cox podem tornar os dados mais gaussianos.
Vantagens e aplicações típicas
A principal vantagem é a eficiência computacional para redes de grande porte. Elas são usadas em controle de processos, previsão de séries temporais e genética. Também são aplicadas em sistemas de recomendação baseados em notas contínuas. Outra vantagem é a facilidade de incorporar relações lineares entre variáveis. Contudo, a linearidade pode ser uma limitação para fenômenos não-lineares. Para esses casos, usa-se redes com misturas de gaussianas ou modelos não-paramétricos.
Redes bayesianas contínuas são amplamente usadas em modelos de equações estruturais. Elas permitem testar hipóteses causais com dados observacionais. A inferência por eliminação de variáveis contínuas usa operações de marginalização gaussiana. Isso é equivalente a calcular distribuições condicionais em normais multivariadas. Uma propriedade importante é que a distribuição conjunta é completamente especificada pela média e precisão. A precisão é a inversa da matriz de covariância, que é esparsa (estrutura da rede). Essa esparsidade reduz custo computacional de O(n³) para O(n * grau²). Aprendizado de estrutura em redes contínuas usa testes de correlação parcial. Testes de independência condicional verificam se a correlação entre duas variáveis é zero dado os pais. Algoritmos como PC (Peter-Clark) constroem o grafo a partir desses testes. Redes contínuas também podem ser dinâmicas (DBNs contínuas) para séries temporais. Nesse caso, usa-se modelos autorregressivos vetoriais com estrutura esparsa. Elas são usadas em economia para prever taxas de juros e inflação. Assim, redes contínuas são uma ferramenta poderosa para dados numéricos.
Um exemplo clássico é a rede que relaciona temperatura (T), pressão (P) e volume (V) de um gás. T e P influenciam V, mas T e P são independentes a priori. A relação é aproximadamente linear (lei dos gases ideais) com ruído gaussiano. A rede permite inferir P dado T e V observados, ou V dado T e P.
Enunciado do exemplo clássico
Implemente uma rede bayesiana gaussiana para o sistema: Variáveis: Temperatura (T ~ N(20, 4)), Pressão (P ~ N(101, 9)), e Volume (V = 0.5*T – 0.3*P + erro, erro ~ N(0, 1)). As relações são: T e P são independentes; V depende de T e P linearmente. Construa a matriz de covariância conjunta e calcule P(V | T=25) e P(P | V=10, T=22). Plote a estrutura da rede e as distribuições condicionais resultantes.
|
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 |
import numpy as np import matplotlib.pyplot as plt import networkx as nx from scipy.stats import multivariate_normal # Definir a rede gaussiana # Variáveis: T (temperatura), P (pressão), V (volume) # T e P são independentes com médias e variâncias dadas mu_T = 20.0 var_T = 4.0 mu_P = 101.0 var_P = 9.0 # V = 0.5*T - 0.3*P + erro, erro ~ N(0,1) coef_T = 0.5 coef_P = -0.3 var_erro = 1.0 # Construir média conjunta (ordem: T, P, V) mu = np.array([mu_T, mu_P, 0.0]) # média de V será calculada mu_V = coef_T * mu_T + coef_P * mu_P mu[2] = mu_V # Construir matriz de covariância conjunta # Cov(T,P)=0 (independentes) cov = np.zeros((3,3)) cov[0,0] = var_T cov[1,1] = var_P # V = coef_T*T + coef_P*P + erro # Cov(V,T) = coef_T * Var(T) + coef_P * Cov(P,T) = coef_T * var_T cov[2,0] = coef_T * var_T cov[0,2] = cov[2,0] # Cov(V,P) = coef_T * Cov(T,P) + coef_P * Var(P) = coef_P * var_P cov[2,1] = coef_P * var_P cov[1,2] = cov[2,1] # Var(V) = coef_T^2 * Var(T) + coef_P^2 * Var(P) + Var(erro) cov[2,2] = coef_T**2 * var_T + coef_P**2 * var_P + var_erro # Inferência condicional por fórmula para normais multivariadas def condicional(mu, cov, idx_obs, valores_obs, idx_pred): # idx_obs: lista de índices observados # valores_obs: valores correspondentes # idx_pred: índice da variável a prever # Retorna (média, variância) condicional mu_obs = mu[idx_obs] mu_pred = mu[idx_pred] cov_obs = cov[np.ix_(idx_obs, idx_obs)] cov_pred_obs = cov[idx_pred, idx_obs] # Média condicional inv_cov_obs = np.linalg.inv(cov_obs) mu_cond = mu_pred + cov_pred_obs @ inv_cov_obs @ (valores_obs - mu_obs) var_cond = cov[idx_pred, idx_pred] - cov_pred_obs @ inv_cov_obs @ cov_pred_obs.T return mu_cond, var_cond # 1. P(V | T=25) mu_V_dado_T, var_V_dado_T = condicional(mu, cov, [0], [25], 2) print(f"P(V | T=25) -> média = {mu_V_dado_T:.4f}, variância = {var_V_dado_T:.4f}") # 2. P(P | V=10, T=22) mu_P_dado_VT, var_P_dado_VT = condicional(mu, cov, [2,0], [10,22], 1) print(f"P(P | V=10, T=22) -> média = {mu_P_dado_VT:.4f}, variância = {var_P_dado_VT:.4f}") # Plotar estrutura da rede G = nx.DiGraph() G.add_edges_from([('T', 'V'), ('P', 'V')]) pos = {'T': (0, 1), 'P': (0, 0), 'V': (1.5, 0.5)} plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) nx.draw(G, pos, with_labels=True, node_color='lightcoral', node_size=2500, font_size=12, font_weight='bold', arrowsize=20, edge_color='gray', width=2) plt.title('Rede Gaussiana - T, P, V') plt.subplot(1, 2, 2) # Plotar distribuições condicionais x = np.linspace(mu_V_dado_T - 3*np.sqrt(var_V_dado_T), mu_V_dado_T + 3*np.sqrt(var_V_dado_T), 200) pdf_V = (1/np.sqrt(2*np.pi*var_V_dado_T)) * np.exp(-0.5*(x-mu_V_dado_T)**2/var_V_dado_T) plt.plot(x, pdf_V, 'b-', linewidth=2, label='P(V | T=25)') x2 = np.linspace(mu_P_dado_VT - 3*np.sqrt(var_P_dado_VT), mu_P_dado_VT + 3*np.sqrt(var_P_dado_VT), 200) pdf_P = (1/np.sqrt(2*np.pi*var_P_dado_VT)) * np.exp(-0.5*(x2-mu_P_dado_VT)**2/var_P_dado_VT) plt.plot(x2, pdf_P, 'r--', linewidth=2, label='P(P | V=10, T=22)') plt.xlabel('Valor da variável') plt.ylabel('Densidade de probabilidade') plt.title('Distribuições Condicionais') plt.legend() plt.grid(True) plt.tight_layout() plt.show() |
Este código implementa uma rede gaussiana com inferência analítica. A estrutura do grafo mostra a dependência de V em T e P. As curvas de densidade mostram as distribuições condicionais solicitadas. A inferência é exata e eficiente, usando apenas álgebra linear. Para iniciantes, este exemplo conecta redes bayesianas a dados contínuos. Redes contínuas são, portanto, uma extensão natural e poderosa.