Question

Je viens de commencer à lire plus sur Markov générateurs de la chaîne aujourd'hui, et je suis vraiment intrigué par le processus de construction d'un. De ma compréhension, l'état futur dépend des états passés statistiques à nos jours.

Exemple:

  

Bonjour tout le monde. Bonjour Dolly. Bonjour tout le monde.

     

"Monde" suit "Bonjour" ~ 66% du temps dans cette source.

Si tel est toujours le cas, alors comment voulez-vous éviter à-mettre les mêmes résultats à chaque fois? Les occurrences statistiques ne changeront pas avec une chaîne statique, donc suis-je raison de supposer que des variantes seront pas tous être générés, à moins que les données source est modifiée d'une certaine façon?

Comment pourrais-je obtenir des variations à partir d'une source statique, compte tenu des valeurs statistiques, tout en permettant une certaine flexibilité? En utilisant mon exemple ci-dessus, comment puis-je autoriser mon générateur à suivre « Bonjour » avec « Dolly », quand « Dolly » suit que « Bonjour » 33% du temps?

Je suppose que ce que je demande, comment fondez-je la probabilité de ma prochaine sélection sur la présence statistique des mots qui suivent ma sélection actuelle? De cette façon, « Dolly » montre en hausse de 33% du temps, et « World » apparaît 66% du temps - ou suis-je complètement perdu ici

Était-ce utile?

La solution

Vous utilisez un générateur de nombres aléatoires pour choisir quel chemin vous allez vers le bas. Vous devez enregistrer chaque état (ce qui est vraiment une histoire de N articles précédents) et les probabilités pour cet état. Ensuite, vous choisissez un nombre aléatoire et de décider en fonction de ce que l'état suivant la transition vers vous est.

Dans votre exemple, vous avez une chaîne de Markov avec un N de 1 vous auriez une structure de la chaîne qui avait l'air quelque chose comme ceci:

<start> -> Hello : 1.0

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

Dolly. -> Hello : 1.0

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

Si votre état actuel est Bonjour, alors vos prochains états possibles sont du monde. et Dolly .. Générer un nombre aléatoire entre 0 et 1 et choisissez Monde. si elle est inférieure à 0,666666, sinon choisissez Dolly.

Avec une chaîne de Markov N = 2, vous obtenez un comportement presque déterministe avec cette entrée:

<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

Autres conseils

Deux commentaires:

1) Pour générer des échantillons à partir d'un processus aléatoire, que ce soit ou non un certain choix est tout à fait (> 50%) probable, et d'autres moins, juste besoin d'un pondérée « coin flip »: générer un nombre réel aléatoire uniforme sur [ 0,1), et d'examiner les possibilités dans le même ordre fixe, en gardant une somme des probabilités jusqu'à présent. Dès que cette somme dépasse votre nombre choisi au hasard, sélectionnez ce choix. Si vos choix sont dénormalisé (pas la somme de 1) probabilités, vous devez d'abord calculer la somme des probabilités s, et non les diviser par tous les s, ou choisissez votre nombre aléatoire sur [0, s)

2) Pour éviter surajustement lors de l'estimation de votre modèle à partir d'une petite quantité de données de formation de l'échantillon (par rapport au nombre de paramètres), utilisez prieurs bayésienne sur les paramètres du modèle. Pour un exemple vraiment cool de cela, où le nombre de paramètres du modèle (taille de l'histoire) n'est pas fixé à un nombre fini à l'avance, voir le Infini HMM . Si vous ne l'utilisez pas des méthodes bayésienne, alors vous aurez envie de choisir la longueur de l'histoire de façon appropriée pour la quantité de données de formation que vous avez, et / ou mettre en œuvre un certain lissage ad hoc (par exemple une interpolation linéaire entre un ordre 2 et order- 1 modèle).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top