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

import numpy as np

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

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

def prever_clima(estado_inicial, dias):
estado_atual = estados.index(estado_inicial)
previsao = [estado_inicial]

for _ in range(dias):
    estado_atual = np.random.choice(
        range(len(estados)), 
        p=matriz_transicao[estado_atual]
    )
    previsao.append(estados[estado_atual])

return previsao
1 resposta

Olá, Penha. Como vai?

O seu projeto prático ficou muito bem estruturado e demonstra uma ótima compreensão de como aplicar modelos probabilísticos para tomada de decisão e modelagem de cenários sob incerteza! As Cadeias de Markov são ferramentas clássicas e poderosas no campo da inteligência artificial e na modelagem de sistemas dinâmicos.

O seu script em Python representa de forma muito limpa e fiel a Propriedade de Markov (também conhecida popularmente como a propriedade de "falta de memória"). No seu laço de repetição, o próximo estado do clima depende exclusivamente do estado do dia atual (estado_atual), obtendo a linha de probabilidades correspondente na matriz e ignorando completamente todo o histórico de dias que antecederam o momento presente.

Gostaria de destacar alguns pontos técnicos ótimos na sua solução:

  • Uso eficiente do NumPy: Utilizar a função np.random.choice() passando o vetor de probabilidades p=matriz_transicao[estado_atual] é a forma mais performática e recomendada em Python para se realizar sorteios ponderados.
  • Modelagem coerente da Matriz de Transição: Os valores que você escolheu ilustram bem as características do clima. O estado "Ensolarado", por exemplo, é altamente estável, com 70% de chance de se manter ensolarado no dia seguinte, enquanto o estado "Nublado" é o mais volátil (40% de chance de permanência e 30% de transição para ensolarado ou chuvoso).

Como contribuição para os seus estudos e para ajudar a organizar o código de quem for testar a sua solução aqui no fórum, deixo duas sugestões rápidas:

  • Ajuste de Indentação: Notei que, na formatação do post do fórum, o bloco interno da função prever_clima e o bloco do laço for perderam o recuo obrigatório exigido pelo interpretador do Python (o que acontece muito quando colamos código diretamente no editor de texto se não estiver dentro de um bloco de código Markdown estruturado). Para que todos consigam rodar o programa diretamente, o código completo com uma chamada de teste fica estruturado desta forma:
import numpy as np

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

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

def prever_clima(estado_inicial, dias):
    estado_atual = estados.index(estado_inicial)
    previsao = [estado_inicial]

    for _ in range(dias):
        estado_atual = np.random.choice(
            range(len(estados)), 
            p=matriz_transicao[estado_atual]
        )
        previsao.append(estados[estado_atual])

    return previsao

# Exemplo de execução simulando 7 dias de clima a partir de um dia "Ensolarado"
simulacao_semana = prever_clima("Ensolarado", 7)
print("Simulação do clima para os próximos 7 dias:")
print(simulacao_semana)
  • Conceito de Distribuição Estacionária (Aprofundamento): Uma característica matemática fantástica das Cadeias de Markov homogêneas e estáveis (como esta do clima) é que, se rodarmos essa simulação por uma quantidade imensa de dias (como 10.000 repetições), a proporção final acumulada de dias ensolarados, nublados e chuvosos convergirá para uma distribuição de probabilidades fixa (chamada de estado estacionário), independentemente de qual tenha sido o clima escolhido no primeiro dia. É um ótimo exercício estatístico rodar a sua função para um número grande de dias e contar a porcentagem de ocorrência de cada clima para ver essa convergência matemática acontecer de forma prática!

Parabéns pelo excelente trabalho no desenvolvimento desse exercício prático!

Espero que possa ter lhe ajudado!