利用人工智能预测双色球

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

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

准备

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

开始

index.html

随便布个局给一些样式.

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

1
2
3
4
5
6
7
8
<!--为了展示方便引入了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. 首先准备双色球数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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]],
    },
    ];

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    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. 定义初始化数据

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    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方法用于预测

    1
    2
    3
    4
    5
    forecast() {
    //保存开始时间
    const start = new Date().getTime();
    预测...
    }
    • forecast方法里首先定义线性衰退模型
    1
    let model = tf.sequential();
    • add 方法添加一个图层实例,tf.layers.dense 创建一个输入输出维度为 7 的层
    1
    model.add(tf.layers.dense({ units: 7, inputShape: [7] }));
    • 指定损失函数和优化器
    1
    model.compile({ loss: "meanSquaredError", optimizer: "sgd" });
    • 格式化数据
    1
    let r = this.formatData();
    • 输入,输出数据
    1
    let [x, y] = [tf.tensor(r.input), tf.tensor(r.output)];
    • 训练模型
    1
    model.fit(x, y);
    • 张量
    1
    let u = tf.tensor(r.use);
    • 开始预测
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    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 · 起手式

作者

刘念

发布于

2019-03-06

更新于

2023-11-22

许可协议

评论