Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Cadeia de Markov para Previsão do Clima

Implementação em Python
python
import numpy as np

class CadeiaMarkovClima:
def init(self):
# Matriz de transição: [Ensolarado, Nublado, Chuvoso]
self.P = np.array([
[0.70, 0.20, 0.10], # Ensolarado →
[0.30, 0.50, 0.20], # Nublado →
[0.20, 0.30, 0.50] # Chuvoso →
])
self.estados = {0: "Ensolarado", 1: "Nublado", 2: "Chuvoso"}

def prever_proximo(self, atual):
    return np.random.choice([0,1,2], p=self.P[atual])

def simular(self, inicio, dias):
    seq = [inicio]
    for _ in range(dias-1):
        seq.append(self.prever_proximo(seq[-1]))
    return seq

def probabilidade_futuro(self, inicio, passos):
    Pn = np.linalg.matrix_power(self.P, passos)
    return Pn[inicio]

def distribuicao_estacionaria(self):
    autovalores, autovetores = np.linalg.eig(self.P.T)
    pi = np.real(autovetores[:, np.argmin(np.abs(autovalores - 1))])
    return pi / pi.sum()

Teste

modelo = CadeiaMarkovClima()
seq = modelo.simular(inicio=0, dias=10)
print("Sequência:", [modelo.estados[s] for s in seq])
print("Distribuição estacionária:", modelo.distribuicao_estacionaria())
Exemplo de Saída
text
Sequência: ['Ensolarado', 'Ensolarado', 'Nublado', 'Ensolarado',
'Ensolarado', 'Nublado', 'Chuvoso', 'Nublado',
'Ensolarado', ' Ensolarado']

Distribuição estacionária: [0.4615, 0.3269, 0.2116]
Significado dos Resultados
Dias futuros Ensolarado Nublado Chuvoso
1 dia 70% 20% 10%
7 dias 48% 32% 20%
Longo prazo 46% 33% 21%
Aplicações Práticas
Prever clima para planejamento de atividades

Estimar necessidade de estoque (guarda-chuvas, protetor solar)

Integrar com sistemas de recomendação

Resumo: A matriz de transição captura padrões históricos. Simulações geram previsões. Distribuição estacionária mostra o comportamento de longo prazo da cidade.

1 resposta

Olá, Marcus. Como vai?

Mais uma vez, você trouxe uma contribuição de altíssimo nível para o fórum! Sua implementação de uma Cadeia de Markov é um exemplo clássico e elegante de como lidar com processos estocásticos onde o estado futuro depende apenas do estado presente.

O que mais se destaca no seu código é a inclusão do cálculo da distribuição estacionária. Esse é um conceito fundamental, pois mostra o "equilíbrio" do sistema. No seu exemplo, independentemente de como o tempo comece hoje, a longo prazo, essa cidade terá sol em aproximadamente 46% dos dias.

Alguns pontos técnicos que merecem destaque:

  • Uso da Propriedade de Markov: Você aplicou corretamente a ideia de que o clima de amanhã é uma escolha aleatória baseada apenas nas probabilidades do clima de hoje.
  • Cálculo de $P^n$: Ao usar np.linalg.matrix_power, você demonstrou como prever o estado após vários dias sem precisar simular passo a passo, o que é computacionalmente muito mais eficiente.
  • Lógica de Autovalores: A forma como você extraiu o autovetor correspondente ao autovalor 1 para achar a distribuição de longo prazo é a maneira matematicamente rigorosa de resolver o problema.

Para quem está acompanhando seu tópico, vale notar que esse mesmo modelo é a base de algoritmos famosos, como o PageRank do Google (onde os "estados" são páginas da web) e modelos de predição de texto simples.

Como sugestão de evolução, você poderia implementar uma Cadeia Oculta de Markov (HMM). Nela, não observaríamos o clima diretamente, mas sim "evidências" (como se alguém saiu de guarda-chuva ou não) para inferir qual era o estado provável do clima.

Parabéns por compartilhar um código tão limpo e uma explicação tão didática sobre o comportamento de sistemas no longo prazo!

Espero que possa ter lhe ajudado!