将机器学习应用于猜谜游戏?

时间:2011-11-08 22:24:22

标签: python artificial-intelligence machine-learning

我在制作游戏时遇到问题。我想我知道解决方案(或者应用什么解决方案),但不确定所有“碎片”是如何组合在一起的。

游戏的运作方式:

(来自How to approach number guessing game(with a twist) algorithm?

将为用户提供具有值的项目(值每天更改,并且程序知道价格的变化)。例如

Apple = 1
Pears = 2
Oranges  = 3

然后他们将有机会选择他们喜欢的任何组合(即100个苹果,20个梨和1个橙子)。计算机获得的唯一输出是总值(在此示例中,其当前为143美元)。电脑会试着猜猜他们有什么。显然,第一次转弯时无法正确使用。

         Value  quantity(day1)  value(day1)
Apple    1      100             100
Pears    2      20              40
Orange   3      1               3
Total           121             143

下一轮用户可以修改他们的数量但不超过总数量的5%(或者我们可能选择的其他百分比。例如,我将使用5%)。水果价格可以随意变化,因此总价值也可能因此而变化(为简单起见,本例中我没有改变水果价格)。使用上面的例子,在游戏的第2天,用户在第3天返回$ 152和$ 164的值。这是一个例子。

quantity(day2)  %change(day2)   value(day2) quantity(day3)  %change(day3)   value(day3)
104                             104         106                             106
21                              42          23                              46
2                               6           4                               12
127             4.96%           152         133             4.72%           164

*(我希望表格显示正确,我不得不手动隔离它们,所以希望它不仅仅是在我的屏幕上进行,如果它不起作用,请告诉我,我会尝试上传截图)。

我试图看看我是否可以弄清楚数量是多少(假设用户有耐心继续输入数字)。我现在知道我唯一的限制是总价值不能超过5%所以我现在不能达到5%的准确度,所以用户将永远进入它。

到目前为止我做了什么:

我已经拿走了水果篮的所有价值和水果篮的总价值,并创造了一个包含所有可能性的大表。一旦我列出了所有可能性,我就使用了图论并为每个可能的解决方案创建了节点。然后,如果它在5%的变化范围内,我会在每天的节点之间创建边(链接)(例如day1到day2)。然后我删除所有没有边缘的节点(链接到其他节点),并且当用户继续播放时,我也会在路径变为死路时删除整个路径。 这很好,因为它缩小了选择范围,但现在我被卡住了,因为我想缩小这些选择范围。我被告知这是一个隐藏的马尔可夫问题,但是一个棘手的版本,因为状态正在改变(正如你可以看到上面的每个回合都添加了新的节点,并且正在删除旧的/不可能的)。

**如果它有帮助,我在baum-welch模型(用于训练数据)的python实现上得到了一个惊人的答案(带有示例代码):Example of implementation of Baum-Welch **

我认为需要做的事情(这可能是错误的):

现在我缩小了结果范围,我基本上试图让程序尝试根据缩小的结果基础来预测正确的结果。我认为这是不可能的,但有几个人建议这可以通过隐藏的马尔可夫模型来解决。我想我可以对数据进行多次迭代(使用Baum-Welch模型),直到概率稳定(并且应该从用户获得更多转弯时变得更好)。 隐藏马尔可夫模型的方式能够检查拼写或手写并在出错时进行改进(在这种情况下的错误是选择在下一回合被删除的篮子是不可能的)。

两个问题:

  1. 如果所有状态首先相等,我如何计算过渡和发射矩阵?例如,由于所有州都同样可能必须使用某些东西来专门改变状态的概率。我正在考虑使用我所做的图来对具有最大边数的节点进行加权,作为过渡/发射状态计算的一部分?这有意义还是有更好的方法?

  2. 如何跟踪状态的所有变化?随着新的篮子被添加并且旧的篮子被移除,存在跟踪篮子的问题。我虽然是一个Hierarchical Dirichlet Process隐藏马尔可夫模型(hdp-hmm),但我并不完全确定如何应用它。

  3. (对不起,如果我听起来有点沮丧......有点难以知道问题是可以解决的但是无法在概念上掌握需要做的事情。)

    一如既往,感谢您的时间,任何意见/建议将不胜感激。

1 个答案:

答案 0 :(得分:16)

就像你说的那样,这个问题可以用HMM来描述。您基本上对维持潜在或隐藏状态的分布感兴趣,这些状态将是每个时间点的真实数量。然而,似乎你混淆了学习HMM参数的问题,而不是简单地在已知的HMM中进行推理。你有后一个问题,但建议采用一个设计用于前者的解决方案(Baum-Welch)。也就是说,你已经有了这个模型,你只需要使用它。

有趣的是,如果您为您的问题编写离散HMM编码,您将得到一个与您在图论解决方案中描述的算法非常相似的算法。最大的区别在于您的解决方案是跟踪可能的内容,而正确的推理算法(如Virterbi algorithm)将跟踪可能的内容。当域中5%范围内存在重叠时,即当多个可能状态可能转换到相同状态时,差异很明显。你的算法可能会为一个点添加2个边,但我怀疑当你计算第二天有效时(它应该计算两次,基本上)。

无论如何,您可以使用Viterbi算法,如果您只对最近一天的最佳猜测感兴趣,我将简要介绍如何修改图论理论解决方案。而不是保持状态之间的边缘维持一个分数代表状态是正确的概率(这种分布有时被称为信念状态)。在每个新的一天,通过递增每个桶的概率来传播你的信念状态(而不是添加边缘你添加一个浮点数)。您还必须确保您的信念状态已正确归一化(总和为1),因此只需在每次更新后除以其总和。之后,您可以通过观察来衡量每个状态,但由于您没有嘈杂的观察,您可以将所有不可能的状态设置为零概率,然后重新标准化。您现在根据观察结果对基础数量进行分配。

我在这里跳过很多统计细节,只是为了给你一个想法。

编辑(重新:问题): 你的问题的答案实际上取决于你想要什么,如果你只想要最近一天的发行版,那么你可以使用我所描述的一次通过算法。但是,如果您希望每天的数量正确分配,那么您将不得不进行向后传递。因此,恰当地命名为forward-backward algorithm。我觉得既然你想回去一步并删除边缘,那么你可能想要所有日子的分布(不像我最初假设的那样)。当然,你注意到有可以使用的信息,以便“未来可以通知过去”可以这么说,这正是为什么你需要做后向传递的原因,这不是很复杂你只是有从链的末尾开始运行完全相同的算法。有关概述,请查看Christopher Bishop关于videolectures.net的6件式教程。

因为你提到添加/删除边缘让我简单说明我之前描述的算法,请记住这是针对单个前向传递。假设总共存在N个可能的数量排列,因此您将拥有一个信念状态,即稀疏向量N个元素长(称为v_0)。第一步,您将收到总和的观察值,并通过将所有可能的值设置为概率1.0来填充矢量,然后重新规范化。下一步,您将创建一个全0的新稀疏向量(v_1),迭代v_0中的所有非零条目,并增加(按v_0中的概率)v_1中5%以内的所有条目。然后,将v_1中根据新观察无法实现的所有条目归零,然后重新规范化v_1并丢弃v_0。永远重复,v_1永远是正确的可能性分布。

顺便说一下,如果你有嘈杂的观察或非常大的状态或连续的状态,事情会变得比这更复杂。由于这个原因,很难阅读一些有关统计推断的文献;这很普遍。