我今天刚刚开始阅读有关马尔可夫链生成器的更多信息,并且对构建一个马尔可夫链生成器的整个过程非常感兴趣。根据我的理解,未来的状态取决于迄今为止的统计过去状态。
示例:
Hello World。你好,多莉。 Hello World。
“世界”跟随“你好”〜66%的时间来源。
如果总是如此,那么你怎么避免每次都输出相同的结果?统计事件不会随着静态字符串而改变,所以我是否正确地假设不会生成任何变体,除非以某种方式修改源数据?
考虑到统计值,我如何从静态源获得变化,同时又允许一些灵活性?使用上面的例子,当“Dolly”只有33%的时间跟随“Hello”时,如何让我的发生器跟随“Dolly”跟随“Hello”?
我想我要问的是,我如何根据我目前选择的单词的统计存在来确定下一次选择的概率?这样,“多莉”出现了33%的时间,“世界”出现了66%的时间 - 或者我完全迷失在这里?
答案 0 :(得分:3)
您使用随机数生成器选择您要走的路径。您必须保存每个状态(这实际上是N个先前项目的历史记录)以及该状态的概率。然后你选择一个随机数并根据它决定你转换到的下一个状态是什么。
在你的例子中,你有一个N为1的Markov链,你的链结构看起来像这样:
<start> -> Hello : 1.0
Hello -> World. : 0.66666
Hello -> Dolly. : 0.33333
Dolly. -> Hello : 1.0
World. -> <end> : 0.5
World. -> Hello : 0.5
如果您当前的状态是Hello,那么您下一个可能的状态是World。和Dolly ..生成0到1之间的随机数并选择World。如果它小于0.666666,否则选择Dolly。
使用N = 2 Markov链,您可以获得几乎确定的行为:
<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
答案 1 :(得分:0)
两条评论:
1)为了从随机过程生成样本,某个选择是否可能完全(> 50%),而其他选择不那么,只需要加权“硬币翻转”:均匀地生成随机实数[0,1],并考虑相同固定顺序的可能性,保持到目前为止的概率总和。只要该金额超过您随机选择的数字,请选择该选项。如果您的选择具有非标准化(不是总和为1)概率,则首先需要计算概率s的总和,并将它们全部除以s,或者在[0,s)上选择随机数
2)为了防止在从少量样本训练数据(与参数数量相比)估计模型时过度拟合,请在模型参数上使用贝叶斯先验。对于一个非常酷的例子,模型参数(历史大小)的数量不是预先固定为任何有限数,请参阅Infinite HMM。如果您不使用贝叶斯方法,那么您将需要根据您拥有的训练数据量适当选择历史长度,和/或实施一些特殊平滑(例如,在订单-2和订单之间进行线性插值 - 1个型号)。