1
resposta

[Projeto] Utilizando cadeias de Markov

import numpy as np

Estados possíveis

estados = ["Ensolarado", "Nublado", "Chuvoso"]

Matriz de transição

Linhas = estado atual

Colunas = próximo estado

matriz_transicao = np.array([
[0.6, 0.3, 0.1], # Ensolarado
[0.3, 0.4, 0.3], # Nublado
[0.2, 0.3, 0.5] # Chuvoso
])

Função para prever o próximo estado

def prever_proximo_estado(estado_atual):
indice = estados.index(estado_atual)
probabilidades = matriz_transicao[indice]

proximo_estado = np.random.choice(estados, p=probabilidades)
return proximo_estado

Função para simular vários dias

def prever_varios_dias(estado_inicial, dias):
resultado = [estado_inicial]
estado_atual = estado_inicial

for _ in range(dias):
    estado_atual = prever_proximo_estado(estado_atual)
    resultado.append(estado_atual)

return resultado

Função para prever distribuição futura (sem aleatoriedade)

def prever_distribuicao(estado_inicial, passos):
vetor_estado = np.zeros(len(estados))
vetor_estado[estados.index(estado_inicial)] = 1

resultado = vetor_estado

for _ in range(passos):
    resultado = np.dot(resultado, matriz_transicao)

return resultado

Teste do sistema

if name == "main":
estado_inicial = "Ensolarado"

print("Simulação de 7 dias:")
previsao = prever_varios_dias(estado_inicial, 7)
print(previsao)

print("\nDistribuição após 5 dias:")
dist = prever_distribuicao(estado_inicial, 5)

for i, estado in enumerate(estados):
    print(f"{estado}: {dist[i]:.2f}")
1 resposta

Oi, Cássio! Como vai?

Agradeço por compartilhar.

Gostei da forma como você organizou a solução, separando a simulação com np.random.choice() da previsão de distribuição com np.dot(). Isso mostra um entendimento muito bom da diferença entre uma previsão aleatória de próximos estados e a análise probabilística do sistema ao longo do tempo, além de deixar o código mais claro com a definição de estados e da matriz_transicao.

Continue firme nos estudos.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!