import numpy as np
# Passo 1: Definição dos Estados e Matriz de Transição
estados = ["Ensolarado", "Nublado", "Chuvoso"]
# Matriz de Transição (P)
# Cada linha representa o estado ATUAL (Ensolarado, Nublado, Chuvoso)
# Cada coluna representa a probabilidade do estado SEGUINTE
matriz_transicao = np.array([
[0.7, 0.2, 0.1], # Se hoje está Ensolarado: 70% Sol, 20% Nublado, 10% Chuva
[0.3, 0.4, 0.3], # Se hoje está Nublado: 30% Sol, 40% Nublado, 30% Chuva
[0.2, 0.3, 0.5] # Se hoje está Chuvoso: 20% Sol, 30% Nublado, 50% Chuva
])
# Passo 2: Lógica da Cadeia de Markov
def prever_clima(estado_inicial, dias, estados, matriz):
previsao = [estado_inicial]
estado_atual_indice = estados.index(estado_inicial)
for _ in range(dias):
# Seleciona o próximo estado com base nas probabilidades da linha atual
proximo_estado = np.random.choice(
estados,
p=matriz[estado_atual_indice]
)
previsao.append(proximo_estado)
# Atualiza o índice para a próxima iteração
estado_atual_indice = estados.index(proximo_estado)
return previsao
# Passo 3: Teste do Modelo
estado_partida = "Ensolarado"
proximos_10_dias = prever_clima(estado_partida, 10, estados, matriz_transicao)
print(f"Previsão começando com '{estado_partida}':")
for i, clima in enumerate(proximos_10_dias):
print(f"Dia {i}: {clima}")
Entendendo o Processamento
Para visualizar o que está acontecendo no código, imagine o seguinte grafo de transições:
Por que usar numpy.random.choice?
Essa função é o "coração" da simulação. Ela recebe a lista de estados e um parâmetro p (as probabilidades). Se o estado atual for Ensolarado, ela olha para a primeira linha da matriz: [0.7, 0.2, 0.1]. O computador então gera um número aleatório e, estatisticamente, escolherá "Ensolarado" 70% das vezes, mantendo a coerência com seus dados históricos.
A Propriedade de Markov
Observe que, para decidir o clima do Dia 5, a função olha apenas para o que aconteceu no Dia 4. Ela não precisa saber como estava o tempo no Dia 1 ou 2. Essa "falta de memória" é o que define uma Cadeia de Markov.