用于预测事件顺序的机器学习算法?
machine-learning
neural-network
python
28
0

简单的机器学习问题。解决这个问题的方法可能很多:

有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库很不错,但是任何方法都可以。

更新:如果每一轮都可能同时发生多个事件,该怎么办。这会改变解决方案吗?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

与其保留完整的历史记录,不如保留关于过去的汇总信息 (以及相对较短的滑动历史记录,用作Predictor逻辑的输入)。

一个暂定的实现可能是这样的:
简而言之: 管理一组递增顺序的Markov链,并对它们的预测进行分级平均

  • 保留单个事件计数表,目的是计算4个不同事件中任何一个的概率,而无需考虑任何顺序。
  • 保留一个bigram 计数表,即[迄今]观察到的事件的累积计数
    表开始为空,观察到第二个事件,我们可以存储第一个双精度数,计数为1。在第三个事件之后,将由第二个和第三个事件组成的双精度数“添加”到表中:或者增加计数现有的二元组或原始计数为1的新二元组。等等
    同时,将表中的二元组总数保持在表中。
    该表和总计数允许基于一个先前的事件来计算给定事件的概率。
  • 以类似的方式保存一张三字母组合计数表,并显示一个总三字母组合的连续计数(请注意,这将等于双字母组合的数量减去一个,因为第一个字母组合是在第一个双字母组合之后添加一个事件,之后是每个新事件都添加了一个)。该三字母组表允许根据前面的两个事件计算给定事件的概率。
  • 同样,保留N克表,最多10克(算法会告诉我们是否需要增加或减少此值)。
  • 保持滑动窗口进入最近的10个事件。
  • 上表提供了预测的基础;总体思路是:
    • 使用将下一个事件的概率表示为基于不同N元语法的各个概率的加权平均值的公式。
    • 通过增加公式中的相应权重来奖励更好的个人N-gram长度;以相反的方式惩罚较差的长度。 (请注意,需要考虑单个事件的边际概率,以免我们偏向于预测最频繁事件的N-gram,而与它们相关的预测值相对较差)
    • 一旦系统“看到”足够多的事件,请查看与长N语法相关的权重的当前值,如果这些值相对较高,请考虑添加表格以保留有关较大N语法的汇总信息。 (不幸的是,这在空间和时间上都伤害了算法)

上述一般逻辑可能有几种变体 。特别是在选择用于“分级”各个N-Gram长度的预测质量的特定度量时。
关于检测和适应事件分布中可能的变化,还应考虑其他因素(以上假设一般是遍历事件的事件源)。一种可能的方法是使用两套表(相应地组合概率),并定期删除其中一组表中所有表的内容。为这些重置选择正确的时间段是一件棘手的事情,从根本上平衡了对具有统计意义的大量历史记录的需求和对足够短的周期的需求,以免我错过了较短的调制...

收藏
评论

这本质上是一个序列预测问题,因此您需要递归神经网络或隐马尔可夫模型。

如果您只有固定的时间可以回顾,那么时间窗口法就足够了。您获取序列数据并将其拆分为长度为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个时间段,并在每个时间段后打印出错误。之后,您可以像这样检查正确的预测:

net.reset()
for i in sequence:
  next_item = net.activate(i) > 0.5
  print next_item

这将为每个事件打印一个布尔数组。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题