google
开发的tensorflow
机器学习框架目前应该是人工智能开发的第一框架,不论从框架的设计,开源环境,还是商业化应用方面都是有着很好的体现.虽然前端暂时和人工智能没啥太大关系,不过科技发展这么快也没准.俗话说得好,梦想是要有的,万一实现了呢?
总的来说双色球的预测无非就是已经有了一堆数字(每一期的开奖结果)要找出一种规律然后计算出下一次的一组数字.这个规律由计算机去找,我们需要做的就是告诉电脑找规律的方向.
准备
index.html
用作展示.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
-
首先准备双色球数据
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}`); });
-
定义初始化数据
data: { //历史数据 items: [], //红球 redBalls: [0, 0, 0, 0, 0, 0], //蓝球 blueBalls: [0], //预测所使用的时间 useTime: 0 }
-
定义
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 }; }
-
定义
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 · 起手式
- 在