Skip to content
返回

利用人工智能预测双色球

google开发的tensorflow机器学习框架目前应该是人工智能开发的第一框架,不论从框架的设计,开源环境,还是商业化应用方面都是有着很好的体现.虽然前端暂时和人工智能没啥太大关系,不过科技发展这么快也没准.俗话说得好,梦想是要有的,万一实现了呢?

总的来说双色球的预测无非就是已经有了一堆数字(每一期的开奖结果)要找出一种规律然后计算出下一次的一组数字.这个规律由计算机去找,我们需要做的就是告诉电脑找规律的方向.

准备

  1. index.html用作展示.
  2. shuangseqiu.js写代码

开始

index.html

随便布个局给一些样式.

没有用任何脚手架,所以直接在html里引入需要的js

<!--为了展示方便引入了vue-->
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
<!--引入axios调用彩票接口-->
<script src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>
<!--引入tensorflow框架-->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
<!--引入自己写的js-->
<script src="shuangseqiu.js"></script>
shuangseqiu.js
  1. 首先准备双色球数据

    const data = [
      {
        data: 2018088,
        value: [[4, 10, 25, 26, 30, 33], [6]],
      },
      {
        data: 2018086,
        value: [[2, 7, 17, 21, 23, 26], [16]],
      },
      {
        data: 2018087,
        value: [[1, 5, 10, 16, 18, 31], [3]],
      },
      {
        data: 2018088,
        value: [[3, 5, 12, 29, 30, 32], [14]],
      },
    ];

    或者调用现有接口并把数据格式处理一下

    axios
      .get("https://bird.ioliu.cn/v1?url=http://f.apiplus.net/ssq-20.json")
      //由于我的博客是全站https,所以需要把http转https
      .then((res) => {
        //拿到数据后把数据格式处理成想要的格式
        let tmp = [];
        for (let i = 0, len = res.data.data.length; i < len; i++) {
          let [red, blue] = [[], []];
          let redTmp = res.data.data[i].opencode.match(/(\S*)\+/)[1].split(",");
          for (let j = 0, jlen = redTmp.length; j < jlen; j++) {
            red.push(parseInt(redTmp[j]));
          }
          blue.push(parseInt(res.data.data[i].opencode.match(/\+(\S*)/)[1]));
          tmp.push({
            data: res.data.data[i].expect,
            value: [red, blue],
          });
        }
        //赋值给vue
        that.items = tmp;
        //调用forecast方法预测
        that.forecast();
      })
      .catch((err) => {
        alert("请求过快,请10秒后重试!");
        console.log(`错误信息${err}`);
      });
  2. 定义初始化数据

    data: {
        //历史数据
        items: [],
        //红球
        redBalls: [0, 0, 0, 0, 0, 0],
        //蓝球
        blueBalls: [0],
        //预测所使用的时间
        useTime: 0
    }
  3. 定义formatData方法格式化数据

    formatData() {
        //格式化数据
        let x = [];
        let y = [];
        let used = [];
        this.items.map((res, index) => {
            if (index !== 0) {
                let b = [...res.value[0], ...res.value[1]];
                y.push(b);
            } else {
                let b = [...res.value[0], ...res.value[1]];
                used.push(b);
            }
            ;
            if (index !== this.items.length - 1) {
                let b = [...res.value[0], ...res.value[1]];
                x.push(b);
            } else {
                let b = [...res.value[0], ...res.value[1]];
                used.push(b);
            }
            ;
        });
        return {
            use: used,
            input: x,
            output: y
        };
    }
  4. 定义forecast方法用于预测

    forecast() {
        //保存开始时间
        const start = new Date().getTime();
        预测...
    }
    • forecast方法里首先定义线性衰退模型
    let model = tf.sequential();
    • add 方法添加一个图层实例,tf.layers.dense 创建一个输入输出维度为 7 的层
    model.add(tf.layers.dense({ units: 7, inputShape: [7] }));
    • 指定损失函数和优化器
    model.compile({ loss: "meanSquaredError", optimizer: "sgd" });
    • 格式化数据
    let r = this.formatData();
    • 输入,输出数据
    let [x, y] = [tf.tensor(r.input), tf.tensor(r.output)];
    • 训练模型
    model.fit(x, y);
    • 张量
    let u = tf.tensor(r.use);
    • 开始预测
    model
      .predict(u)
      .data()
      .then((res) => {
        res.map((ball, index) => {
          if (index < 6) {
            // 限制红球结果
            let balls = Math.abs(parseInt(ball));
            if (balls === 0) {
              balls = 1;
            }
            if (balls > 35) {
              balls = 35;
            }
            this.redBalls[index] = balls;
          } else {
            // 限制蓝球结果
            let balls = Math.abs(parseInt(ball));
            if (balls === 0) {
              balls = 1;
            }
            if (balls > 16) {
              balls = 16;
            }
            this.blueBalls[0] = balls;
          }
        });
        //定义一个set
        const tmp = new Set(this.redBalls);
        //判断是否有重复项,如果有就重新预测
        if ([...tmp].length < 6) {
          this.forecast();
          return false;
        }
        //红球从小到大排序
        this.redBalls.sort((a, b) => {
          return a > b;
        });
        //预测结束
        //保存结束时间
        const end = new Date().getTime();
        //计算所用时间
        this.useTime = end - start;
      });

    最后在页面中查看结果

    完整代码

    参考链接:TensorFlow.js · 起手式


 

上一篇
MAC上的Chrome 恢复白色主题
下一篇
利用现代浏览器所提供的强大 API 录制,回放并保存任意 web 界面中的用户操作