<p>与其保留完整的历史记录,不如保留过去的聚合信息(以及相对较短的滑动历史记录,用作预测逻辑的输入)。</p>
<p>一个暂定的实现可以如下:<br/>
简而言之:<strong>管理一组递增阶的马尔可夫链<em>,以及<em>分级</em>和<em>平均</em>它们的预测</strong></p>
<ul>
<li>保留一个单独事件计数表,其目的是计算4个不同事件中任何一个的概率,而不考虑任何序列。</li>
<li>保留一个bigram<em>计数表,即[迄今为止]观察到的事件的累积计数<br/>
表从空开始,在观察到第二个事件时,我们可以存储第一个bigram,其计数为1。在第三个事件上,由第二个和第三个事件组成的bigram被“添加”到表中:要么增加现有bigram的计数,要么添加原始计数1,作为一个新的(迄今为止从未见过的)bigram。等<br/>
同时,在表中保留bigram的总数。<br/>
此表和总计数允许基于前一个事件计算给定事件的概率。</li>
<li>以类似的方式保存一个三元数表和一个看到的总三元数的运行记录(注意,这将等于双元数减一,因为第一个三元数在第一个双元数之后添加一个事件,并且在第一个双元数之后添加每个事件中的一个)。此三元表允许根据前面两个事件计算给定事件的概率。</li>
<li>同样,保留N-Grams的表,最多10克(算法将告诉我们是否需要增加或减少这个值)。</li>
<li>在最后10个事件中保持滑动窗口。</li>
<li>上表为预测提供了依据;总体思路是:
<ul>
<li>使用一个公式,将下一个事件的概率表示为基于不同N-grams的单个概率的加权平均值。</li>
<li>通过增加公式中相应的权重奖励更好的个体N-gram长度;以相反的方式惩罚更差的长度。(请注意,需要考虑单个事件的边际概率,以免我们倾向于预测最频繁事件的N-grams,而不管与它们相关联的预测值相对较低)</li>
<li>一旦系统“看到”了足够多的事件,请查看与长N-Grams相关联的权重的当前值,如果这些值相对较高,请考虑添加表以保留有关更大N-Grams的聚合信息。(不幸的是,这在空间和时间上都损害了算法的正确性)</li>
</ul></li>
</ul>
<p>上面描述的一般逻辑可以有几个变体。特别是在选择用于“分级”单个N-Gram长度的预测质量的特定度量时。<br/>
对于检测和适应事件分布中的可能变化,还应考虑其他因素(上述假设通常是遍历事件源)。一种可能的方法是使用两组表(相应地组合概率),并定期删除其中一组表中所有表的内容。为这些重置选择正确的时间段是一项棘手的工作,基本上平衡了对具有统计意义的大量历史数据的需求和对足够短的时间段的需求,以免我错过较短的调整。。。</p>