- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在制作的游戏有问题。我想我知道解决方案(或适用什么解决方案),但不确定所有“部分”如何组合在一起。
游戏的工作方式:
(来自How to approach number guessing game(with a twist) algorithm?)
将为用户提供带有值的商品(值每天都会更改,并且程序会意识到价格的变化)。例如
Apple = 1
Pears = 2
Oranges = 3
Value quantity(day1) value(day1)
Apple 1 100 100
Pears 2 20 40
Orange 3 1 3
Total 121 143
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
最佳答案
就像您说的那样,可以使用HMM来描述此问题。您实际上对保持潜在状态或隐藏状态的分布感兴趣,这是每个时间点的真实数量。但是,与仅在已知HMM中进行推论相反,似乎让您迷惑了为HMM学习参数的问题。您有后一个问题,但建议采用一个解决方案(Baum-Welch)来设计前一个问题。也就是说,您已经有了模型,只需要使用它即可。
有趣的是,如果您针对问题进行离散HMM编码,则所获得的算法与图论解决方案中描述的算法非常相似。最大的区别是您的解决方案正在跟踪可能是的可能性,而正确的推理算法(例如Virterbi algorithm)将跟踪可能是的东西。当域的5%范围内有重叠时,也就是说,当多个可能的状态可能潜在地转换为同一状态时,差异显而易见。您的算法可能会在一条点上增加2条边,但是我怀疑当您计算第二天有效果时(本质上应该计算两次)。
无论如何,您可以使用Viterbi算法,如果您只对最近一天的最佳猜测感兴趣,那么我只是给您一个简短的想法,您可以如何修改图形理论解决方案。代替维持状态之间的边缘,而是保留代表状态正确的概率的分数(此分布有时称为置信状态)。在每个新的一天,通过将每个存储桶作为父项的概率递增(而不是通过添加浮点数来增加边沿)来传播您的信念状态。您还必须确保您的信念状态已正确归一化(总和为1),因此在每次更新后只需除以其总和即可。之后,您可以通过观察加权每个状态,但是由于您没有嘈杂的观察,因此您可以将所有不可能的状态设置为零概率,然后重新进行归一化。现在,您可以根据观测条件分配基础数量。
我在这里跳过了很多统计细节,只是为了给您一个想法。
编辑(回复:问题):
您问题的答案实际上取决于您想要的内容,如果您只希望获得最近一天的分布,则可以采用我所描述的一遍算法。但是,如果您想在每一天对数量进行正确的分配,则还必须进行向后传递。因此,恰当地命名为forward-backward algorithm。我感觉到,由于您希望退后一步并删除边线,因此您可能希望整天都进行分配(与我最初假设的不同)。当然,您已经注意到可以使用一些信息,以便可以说“ future 可以告知过去”,这正是您也需要进行反向传递的原因,您仅拥有的并不复杂从链的末尾开始运行完全相同的算法。要获得良好的概述,请在videolectures.net上查看Christopher Bishop的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将永远是可能性的正确分配。
顺便说一句,如果您有嘈杂的观察结果,非常大的状态或连续状态,那么事情会变得比这更复杂。因此,很难阅读一些有关统计推论的文献。这很一般。
关于python - 将机器学习应用于猜谜游戏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8057936/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!