利用人工智能预测双色球
google
开发的tensorflow
机器学习框架目前应该是人工智能开发的第一框架,不论从框架的设计,开源环境,还是商业化应用方面都是有着很好的体现.虽然前端暂时和人工智能没啥太大关系,不过科技发展这么快也没准.俗话说得好,梦想是要有的,万一实现了呢?
总的来说双色球的预测无非就是已经有了一堆数字(每一期的开奖结果)要找出一种规律然后计算出下一次的一组数字.这个规律由计算机去找,我们需要做的就是告诉电脑找规律的方向.
准备
index.html
用作展示.shuangseqiu.js
写代码
开始
index.html
随便布个局给一些样式.
没有用任何脚手架,所以直接在html
里引入需要的js
1 | <!--为了展示方便引入了vue--> |
shuangseqiu.js
首先准备双色球数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18const 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
27axios
.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}`);
});定义初始化数据
1
2
3
4
5
6
7
8
9
10data: {
//历史数据
items: [],
//红球
redBalls: [0, 0, 0, 0, 0, 0],
//蓝球
blueBalls: [0],
//预测所使用的时间
useTime: 0
}定义
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
29formatData() {
//格式化数据
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
方法用于预测1
2
3
4
5forecast() {
//保存开始时间
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
44model
.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 · 起手式
- 在