Pergunta

Comecei a ler mais sobre os geradores da cadeia de Markov hoje e estou realmente intrigado com todo o processo de construção de um. Pela minha compreensão, o estado futuro depende dos estados do passado estatístico para o presente.

Exemplo:

Olá Mundo. Olá Dolly. Olá Mundo.

"World" segue "Hello" ~ 66% das vezes nessa fonte.

Se esse for sempre o caso, como você evita superar os mesmos resultados a cada vez? As ocorrências estatísticas não mudarão com uma corda estática, por isso estou certo ao assumir que nenhuma variante será gerada, a menos que os dados de origem sejam modificados de alguma forma?

Como eu poderia obter variações de uma fonte estática, considerando os valores estatísticos, mas permitindo alguma flexibilidade? Usando meu exemplo acima, como permito que meu gerador siga "Hello" com "Dolly", quando "Dolly" segue apenas "Hello" 33% das vezes?

Acho que o que estou perguntando é: como basear a probabilidade da minha próxima seleção na presença estatística das palavras que seguem minha seleção atual? Dessa forma, "Dolly" aparece 33% das vezes, e "World" aparece 66% das vezes - ou estou completamente perdido aqui?

Foi útil?

Solução

Você usa um gerador de números aleatórios para escolher qual caminho você segue. Você precisa salvar cada estado (que é realmente um histórico de n itens anteriores) e as probabilidades para esse estado. Então você escolhe um número aleatório e decide com base nele qual é o próximo estado para o qual você faz a transição.

No seu exemplo, você tem uma cadeia de Markov com um n de 1, você teria uma estrutura de corrente que parecia algo assim:

<start> -> Hello : 1.0

Hello -> World. : 0.66666
Hello -> Dolly. : 0.33333

Dolly. -> Hello : 1.0

World. -> <end> : 0.5
World. -> Hello : 0.5

Se seu estado atual é olá, seus próximos estados possíveis são o mundo. e Dolly .. Gere um número aleatório entre 0 e 1 e escolha o mundo. Se for menor que 0,666666, escolha Dolly.

Com uma cadeia n = 2 Markov, você obtém um comportamento quase determinístico com essa entrada:

<start> <start> -> <start> Hello : 1.0

<start> Hello -> Hello World. : 1.0

Hello World. -> World. Hello : 0.5
Hello World. -> World. <end> : 0.5

World. Hello -> Hello Dolly. : 1.0

Hello Dolly. -> Dolly. Hello : 1.0

Dolly. Hello -> Hello World. : 1.0

Outras dicas

Dois comentários:

1) Para gerar amostras de um processo aleatório, seja ou não uma determinada opção (> 50%) provavelmente, e outras menos, apenas requer uma "moeda de moeda" ponderada: gerar um número real aleatório uniformemente em [0,1 ) e considere as possibilidades na mesma ordem fixa, mantendo uma soma de probabilidades até agora. Assim que essa soma exceder seu número escolhido aleatoriamente, selecione essa opção. Se suas escolhas tiveram probabilidades não formalizadas (não resumindo 1), primeiro você precisa calcular a soma das probabilidades s e dividi -las todas por s ou escolher seu número aleatório em [0, s)

2) Para evitar o excesso de ajuste ao estimar seu modelo a partir de uma pequena quantidade de dados de treinamento de amostra (em comparação com o número de parâmetros), use os anteriores bayesianos nos parâmetros do modelo. Para um exemplo muito legal disso, onde o número de parâmetros do modelo (tamanho do histórico) não é fixado em nenhum número finito, consulte o Hmm infinito. Se você não usa métodos bayesianos, você deseja escolher o comprimento do histórico adequadamente para a quantidade de dados de treinamento que você possui e/ou implementar alguma suavização ad-hoc (por exemplo, interpolação linear entre um pedido 2 e o pedido- 1 modelo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top