想法#1
根据您给出的简短描述,并假设您有一些数据(或可以合成它),我会尝试训练一个隐马尔可夫模型。在这里查看一个很棒的视觉入门。直观地说,HMM 会按照您的描述进行操作。
有一些可观察的:
- 你在机器里放了多少糖果,
- 多少出来,和
- 我们在哪个时间步
有某些状态(这里只是离散状态):
- 分发的糖果数量增加(严格增加)
- 分发的糖果量减少(严格减少)
最后,有一个转换:在这些状态之间,给定输入。就您而言,这些是可观察的。
然而,对于 HMM,我们假设有更多的东西。有一些隐藏状态(潜在状态)是无法观察到的。该模型跟踪这些并将它们与上面的 observables 列表结合使用来决定如何行动——它具有完整的映射功能。下面是这样一个模型的示意图:

这仅显示了几个状态,以及转换到其他状态或处于相同状态的概率。查看源代码以获取图表的详细说明。人们已经可以想象为您的问题绘制这张图。
有关 HMM 理论的更多信息,我推荐Jeff Bilmes 的这个基于文本的演练,以及mathmonk的这个 YouTube 系列(播放列表的第 14 章)。如果你走这条路,你可能会考虑尝试Pomegranate library (in Python)。
决定做什么、采取什么行动的最终逻辑是您可以硬编码或使用模型为您执行的操作。例如,硬编码方法类似于:
if current_state == 'normal':
take_lots_of_candy()
elif current_state == 'unsure':
take_some_candy()
elif current_State == 'dangerous':
pause_taking_candy()
else:
catch_other_states()
对于基于模型的方法,您可以进一步扩展下面概述的想法。
想法#2
当然,您本质上只是将一些输入映射到一些输出。几乎任何机器学习算法都会有很好的表现——取决于你的魔法机器内部工作的复杂性——会更好或更差。诸如提升(例如通过梯度下降)之类的算法通常需要您将某种信息放入模型中,例如通过指定回归方程,将输入映射到输出。一个好的实现是R中的mboost包。有一个很棒的教程可以帮助决定什么可能是重要的。
想法#3
回到仅将输入映射到输出的问题:来自 Scikit-Learn 的简单多层感知器 (MLP) - 也称为前馈神经网络 - 从理论上讲,它应该能够灵活地逼近您可能抛出的任何函数(使用几个假设)。如果您的MLP不能满足要求,您也可以使用各种深度学习框架之一来实现这一点。
最后的想法
最后我想强调的是,您的最终模型可能只会与您提供的数据一样好,并且虽然它可能在您的合成训练数据上运行良好,但不能保证泛化,无需更多考虑具体问题以及从中采样数据的特定分布。
如果您采用马尔可夫模型的方式,那么您也许可以将它们的状态预测用作进一步模型的输入;从而创建一个合奏。
如果您想真正了解序列分析中当前最先进的模型,您可以冒险进入循环神经网络的世界,例如利用 LSTM 单元,它保持内部状态表示,包括新信息和选择性地丢弃旧信息。这可能是在一个大型模型中考虑所有观点的好方法。这里的问题是,您通常需要大量数据来训练这样的模型。