一共4656条记录,4600多期了。共出现了988个不重复的结果,就是说还有(1000–988)12组数到现在还没有开出来过。文件中第一行是最新的一期,第二行是之前的一期,。。。,最后一行是第一期。
我们可以把三个数组合成一组数,就像数据集中体现的那样,并且把一组数当作一个数或者说当作一个单词。这样在预处理数据集的时候会简单一些,从索引到单词(0->‘000’)和从单词到索引(‘012’->12)其实都是同一个数。
网络的输入是每一期的开奖结果,总共有1000组数,用onehot编码是一个1000维的稀疏向量:
网络训练的代码,使用了几个trick,在下文<构建计算图>和<训练>章节会做说明,<结论>在最后。
首先要做的事是对数据进行预处理,要实现下面的函数:
LookupTable
使用词向量之前,我们需要先准备好单词(彩票开奖记录)和ID之间的转换关系。在这个函数中,创建并返回两个字典:
使用实现的神经网络构建计算图。要说明的是优化损失的部分,这里要优化两个损失:cost:损失函数没有使用softmax交叉熵,而是使用了sequenceloss。similar_loss:另外一个要优化的想法是,要让预测的结果与正确结果在嵌入矩阵中的特征向量尽量接近,即让两者距离越来越小。得到了最终的损失:total_loss=cost+similar_loss使用normalized_embedding做相似度上距离的计算。
在预处理过的数据上训练神经网络。这里除了保存预测准确率之外,还保存了三类准确率:
这里距离中位数准确率我分别在预测结果向量和与预测结果Top1距离最近的相似度向量中都做了统计,从结果来看在相似度向量中的距离中位数准确率要稍好一些。
浮动距离中位数的概率越高,说明我们的模型训练的不好,理想情况下应该是TopK准确率越来越高,说明模型预测的越来越准确。一旦模型预测的很差,那么预测向量中一定会有一部分区域是热点区域,也就是距离中位数指示的区域,这样可以通过距离中位数来进行预测。我们使用距离中位数来帮助我们进行预测,相当于为预测做了第二套方案,一旦模型预测不准确的时候,可以尝试使用距离中位数来预测。
这三类准确率都是范围的,我们只能知道在某个范围内猜中的概率会高一些,但是到底是范围内的哪一个是准确值则很难说。
最后一次迭代输出的结果:
实现pick_word()函数从概率向量probabilities或相似度向量sim中选择号码。pred_mode是选择预测的种类:
先从数据上说,训练的最后打印出的准确率如下:
正常的开奖概率是1‰。经过25次迭代训练之后准确率是0,一个都没猜中。。。topk和相似度向量topk差不多,都是25‰左右,但因为是top10,所以实际上是2.5‰左右。
浮动中位数准确率在11.25‰~32.5‰之间,但由于这个范围range10,所以实际上是1.125~3.25‰之间。
最好的时刻是在Epoch2floatingmedianrangekaccuracy0.041666666666666664,也就是4.16‰。真没比正常开奖概率好多少。
从训练结果打印出的准确率,和往期开奖的相互之间的距离图都可以看得出来,想进行彩票预测实际上是不可行的。在排列三如此简单的、排列组合只有1000(样本空间已经足够小了)的等概率事件上进行预测都如此的困难,这也印证了数学的奇妙之处。都说了彩票是等概率,那么出任何一种号码都是有可能的,没有规律可言。惊不惊喜?意不意外?
既然不能准确的预测,唯一能给我们提供思路的就是学习器学到的趋势,来看看下面的代码。
看得出来,虽然每期预测的号码不对,但是下一期号码的大概范围以及若干期号码的变化趋势学习的还可以,剩下的就要靠运气了:)
看看最后一期的号码是427,我们预测的是419,是不是很接近?