预测事件顺序的机器学习算法?
Posted
技术标签:
【中文标题】预测事件顺序的机器学习算法?【英文标题】:Machine Learning Algorithm for Predicting Order of Events? 【发布时间】:2011-02-01 05:58:29 【问题描述】:简单的机器学习问题。可能有很多方法可以解决这个问题:
有 4 个可能的事件的无限流:
'event_1', 'event_2', 'event_4', 'event_4'
事件的顺序并非完全随机。我们将假设大多数事件的出现顺序有一些复杂的模式,而其余事件只是随机的。不过,我们并不提前知道这些模式。
收到每个事件后,我想根据过去事件的发生顺序来预测下一个事件将是什么。所以我的问题是:我应该为这个预测器使用什么机器学习算法?
然后预测器将被告知下一个事件实际上是什么:
Predictor=new_predictor()
prev_event=False
while True:
event=get_event()
if prev_event is not False:
Predictor.last_event_was(prev_event)
predicted_event=Predictor.predict_next_event(event)
问题在于预测器应该维持多长时间的历史,因为维持无限的历史是不可能的。我会留给你来回答。出于实用性考虑,答案不可能是无限的。
因此,我相信必须通过某种滚动历史来进行预测。因此,添加新事件和使旧事件过期应该是相当有效的,例如,不需要重建整个预测器模型。
具体的代码,而不是研究论文,会为我巨大的价值添加到您的回复中。 Python 或 C 库都不错,但什么都可以。
更新:如果每一轮可以同时发生多个事件怎么办。这会改变解决方案吗?
【问题讨论】:
【参考方案1】:这本质上是一个序列预测问题,所以你需要递归神经网络或隐马尔可夫模型。
如果您只有固定的回顾时间,时间窗口方法可能就足够了。您获取序列数据并将其拆分为长度为 n 的重叠窗口。 (例如,您将序列 ABCDEFG 拆分为 ABC、BCD、CDE、DEF、EFG)。然后你训练一个函数逼近器(例如神经网络或线性回归)将该窗口的前 n-1 个部分映射到第 n 个部分。
您的预测器将无法及时回顾超过您的窗口大小。 RNN 和 HMM 在理论上可以做到这一点,但很难调优或者有时根本不起作用。
(可以在 PyBrain http://pybrain.org 中找到最先进的 RNN 实现)
更新:这是解决您问题的 pybrain 代码。 (我没有测试过,可能有一些错别字和东西,但整体结构应该可以。)
from pybrain.datasets import SequentialDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import SigmoidLayer
INPUTS = 4
HIDDEN = 10
OUTPUTS = 4
net = buildNetwork(INPUTS, HIDDEN, OUTPUTS, hiddenclass=LSTMLayer, outclass=SigmoidLayer, recurrent=True)
ds = SequentialDataSet(INPUTS, OUTPUTS)
# your_sequences is a list of lists of tuples which each are a bitmask
# indicating the event (so 1.0 at position i if event i happens, 0.0 otherwise)
for sequence in your_sequences:
for (inpt, target) in zip(sequence, sequence[1:]):
ds.newSequence()
ds.appendLinked(inpt, target)
net.randomize()
trainer = BackpropTrainer(net, ds, learningrate=0.05, momentum=0.99)
for _ in range(1000):
print trainer.train()
这将训练循环网络 1000 个 epoch 并在每个 epoch 之后打印出错误。之后,您可以像这样检查正确的预测:
net.reset()
for i in sequence:
next_item = net.activate(i) > 0.5
print next_item
这将为每个事件打印一个布尔数组。
【讨论】:
是否可以提供一个小例子来说明“your_sequences”变量的外观?即使有描述,我想我也没有做对。【参考方案2】:与其保留完整的历史记录,不如保留关于过去的聚合信息(连同相对较短的滑动历史记录,用作预测器逻辑的输入) )。
试探性的实现可能是这样的: 简而言之:管理一组递增顺序的马尔可夫链,以及分级和平均他们的预测
保留单个事件计数表,目的是计算 4 个不同事件中任何一个事件的概率,而不考虑任何顺序。 保留一个二元表计数,即[到目前为止]观察到的事件的累积计数 表开始为空,在第二个事件观察时,我们可以存储第一个二元组,计数为 1。在第三个事件时,由第二个和第三个事件组成的二元组被“添加”到表中:要么增加计数现有的二元组或添加原始计数 1,作为新的(迄今为止从未见过的)二元组。等等 同时,在表中保留二元组的总数。 该表和总计数允许根据前一个事件计算给定事件的概率。 以类似的方式保留一个三元组计数表,以及看到的总三元组的运行计数(请注意,这将等于二元组的数量减一,因为第一个三元组是在第一个二元组之后添加一个事件,然后每个新事件都添加一个)。此三元表允许根据前两个事件计算给定事件的概率。 同样,为 N-Grams 保留表格,例如,最多 10-grams(算法会告诉我们是否需要增加或减少这个)。 在最后 10 个事件中保留一个滑动窗口。 以上表格为预测提供了依据;总体思路是: 使用一个公式,将下一个事件的概率表示为基于不同 N-gram 的单个概率的加权平均值。 通过增加公式中相应的权重来奖励更好的个体N-gram长度;以相反的方式惩罚较差的长度。 (请注意,需要考虑单个事件的边际概率,以免我们偏爱恰好预测最频繁事件的 N-gram,而不管与它们相关的相对较差的预测值) 一旦系统“看到”了足够多的事件,请查看与长 N-Gram 相关的权重的当前值,如果这些值相对较高,请考虑添加表格以保留有关更大 N-Gram 的汇总信息。 (不幸的是,这在空间和时间方面都损害了算法)上述一般逻辑可能有多种变体。特别是在选择用于“分级”各个 N-Gram 长度的预测质量的特定度量时。 关于检测和适应事件分布的可能变化(以上假设一般遍历事件源),还应考虑其他因素。一种可能的方法是使用两组表(相应地组合概率),并定期删除其中一组表的所有表的内容。为这些重置选择正确的时间段是一项棘手的工作,基本上要平衡对具有统计意义的大量历史记录的需求和足够短的时间段的需求,以免我错过较短的调制......
【讨论】:
这是我会尝试的。与神经网络不同,它应该易于实现,更重要的是易于理解。【参考方案3】:问题是预测器应该保持多长时间的历史记录
唯一的答案是“视情况而定”。
这取决于这需要有多准确。我不相信即使有无限的历史,这种策略也不会 100% 准确。尝试 10 的历史,您将获得 x% 的准确度,然后尝试 100,您将获得 y% 的准确度,等等......
最终,您应该会发现系统与您期望的一样准确,或者您会发现准确性的提高不值得增加历史长度(以及增加的内存使用量、处理时间等......)。至此,要么工作完成,要么您需要寻找新策略。
我认为研究一个简单的“软”神经网络可能是一个更好的计划。
【讨论】:
虽然,您可能会做一些数学运算来计算出给定历史的预期准确度,但这取决于您的算法。 您无法确定回溯所需的时间,因为您不知道潜在的动态。你只是现在的例子,你看到的甚至可能是随机的。【参考方案4】:我们刚刚研究了计算机体系结构中的branch-predictors(因为处理器实际评估条件 if(EXPRESSION) 需要很长时间,它会尝试“猜测”并以这种方式节省一些时间)。我确信在这方面已经进行了更多的研究,但目前我能想到的只有这些。
我还没有见过像你这样独特的设置,所以我认为你可能需要自己做一些初步的实验。尝试使用 N 个插槽的历史运行您的解决方案 X 秒,正确率是多少?并将其与相同的固定 X 和不同的 N 历史槽进行比较,以尝试找到最佳的内存历史比率(将它们绘制出来)。
如果可以同时发生多个事件...这有点费解,那里必须有一些限制:如果一次发生无限数量的事件怎么办?呃,这对你来说在计算上是不可能的。我会尝试与一次仅一个事件相同的方法,除非启用了预测器,一次预测多个事件。
【讨论】:
然而,分支预测器被设计为在硬件上工作。当您不太关心微秒时,您可以使用更复杂的算法。 确实如此 - 但存在相同的内存与正确性(减去微秒)的潜在问题。一些流行的分支预测器使用马尔可夫模型。【参考方案5】:处理器使用一些非常轻量级的技巧来预测分支语句是否会分支。这有助于他们进行高效的管道内衬。例如,它们可能不像马尔可夫模型那样通用,但由于它们的简单性,它们很有趣。 Here is the Wikipedia article on branch prediction。查看饱和计数器和两级自适应预测器
【讨论】:
以上是关于预测事件顺序的机器学习算法?的主要内容,如果未能解决你的问题,请参考以下文章