双色球预测的一次尝试



萌发预测双色球的想法来源于很久以前,小时候电视上看双色球开奖结果的时候,总会发现当解说员说“下一个中奖号码是···”的时候,中奖号码就跳出来了,所以我认为是可以认为控制的,至于可不可以预测,那就不知道了,反正试试吧。

首先我得收集双色球的中奖号码,通过历史中奖号码来预测下一组号码。

表结构设计:

中奖号码表:


字段名


名称


类型


备注


lottery_date


日期


varchar


主键


phase


期号


varchar


red_1


1号球


int


red_2


2号球


int


red_3


3号球


int


red_4


4号球


int


red_5


5号球


int


red_6


6号球


int


blue


蓝色球


int


lucky_blue


幸运蓝球


int

预测表:


字段名


名称


类型


备注


id


ID


int


主键


phase


期号


varchar


red_1


1号球


int


red_2


2号球


int


red_3


3号球


int


red_4


4号球


int


red_5


5号球


int


red_6


6号球


int


blue


蓝色球


int


lucky_blue


幸运蓝球


int

误差表:


字段名


名称


类型


备注


id


ID


int


主键


phase


期号


varchar


red_1


1号球


int


red_2


2号球


int


red_3


3号球


int


red_4


4号球


int


red_5


5号球


int


red_6


6号球


int


blue


蓝色球


int


lucky_blue


幸运蓝球


int

收集数据:用Java编写爬虫收集双色球中奖数据,顺便说下爬虫的使用时我在超级课程表面试的时候学会使用的,现在可以用到这个上面来实在是太幸运了。

Java代码爬虫部分

/**
 * this class will grab the information of each lottery
 * run this method you will grab the latest information of the lottery
 *
 *
 */

public class Spider {

	public static String getHtmlByUrl(String url) {
		String html = null;
		HttpClient httpClient = new DefaultHttpClient();// 创建httpClient对象
		HttpGet httpget = new HttpGet(url);// 以get方式请求该URL
		try {
			HttpResponse responce = httpClient.execute(httpget);// 得到responce对象
			int resStatu = responce.getStatusLine().getStatusCode();// 返回码
			if (resStatu == HttpStatus.SC_OK) {// 200正常 其他就不对
				// 获得相应实体
				HttpEntity entity = responce.getEntity();
				if (entity != null) {
					html = EntityUtils.toString(entity);// 获得html源代码
				}
			}
		} catch (Exception e) {
			System.out.println("访问【" + url + "】出现异常!");
			e.printStackTrace();
		} finally {
			httpClient.getConnectionManager().shutdown();
		}
		return html;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		DataStore dataStore = new DataStore();
		Lottery lottery = new Lottery();

		String html = getHtmlByUrl("http://baidu.lecai.com/lottery/draw/list/ssq.php");
		if (html != null && !"".equals(html)) {
			Document doc = Jsoup.parse(html);
			Elements trs = doc.select("table").first().select("tbody").select("tr");
			Elements tds = trs.get(4).select("td");

			String phase = tds.get(0).text();
			lottery.setPhase(phase);

			String date = tds.get(1).text();
			date = date.substring(0, 10);
			lottery.setDate(date);

			Elements tds2 = tds.get(2).select("em");
			int[] a = new int[tds2.size()];
			for (int i = 0; i < tds2.size(); i++) {

				String text = tds2.get(i).text();
				a[i] = Integer.parseInt(text);
			}

			lottery.setRed_1(a[0]);
			lottery.setRed_2(a[1]);
			lottery.setRed_3(a[2]);
			lottery.setRed_4(a[3]);
			lottery.setRed_5(a[4]);
			lottery.setRed_6(a[5]);
			lottery.setBlue(a[6]);
			if(a.length == 8){
				lottery.setLucky_blue(a[a.length-1]);
			}
			dataStore.storeData(lottery);

		}
	}

}

数据存储部分,使用了Hibernate:

public void storeData(Lottery lottery){

		System.out.println(lottery.getDate());
		System.out.println(lottery.getPhase());
		System.out.println(lottery.getRed_1());
		System.out.println(lottery.getRed_2());
		System.out.println(lottery.getRed_3());
		System.out.println(lottery.getRed_4());
		System.out.println(lottery.getRed_5());
		System.out.println(lottery.getRed_6());
		System.out.println(lottery.getBlue());
		System.out.println(lottery.getLucky_blue());
		try{
			session=HibernateUtils.getSession();
			session.beginTransaction();
			session.save(lottery);

			session.getTransaction().commit();
			System.out.println("the date stored successfully");
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}

	}

缺点是如果网页结构改变的话,代码也需要重新修改。

目前我收集是从2014年10月19日到2015年4月7日的数据。

画出每个号码的走势图:使用Python。

import mysql.connector
from matplotlib.pyplot import plot
from matplotlib.pyplot import show

conn = mysql.connector.connect(user='root', password='root', database='lottery_forecast', use_unicode=True)
cursor = conn.cursor()

cursor.execute('select * from tb_lottery')
values = cursor.fetchall()

phase = []
red1 = []
red2 = []
red3 = []
red4 = []
red5 = []
red6 = []
blue = []

for i in values:
    #print i[2:9]
    phase.append(i[1])
    red1.append(i[2])
    red2.append(i[3])
    red3.append(i[4])
    red4.append(i[5])
    red5.append(i[6])
    red6.append(i[7])
    blue.append(i[8])

plot(red1,lw=1.0)
plot(red2,lw=1.0)
plot(red3,lw=1.0)
plot(red4,lw=1.0)
plot(red5,lw=1.0)
plot(red6,lw=1.0)
plot(blue,lw=2.0)
show()

结果如下图:

细线:深蓝色:1号球,绿色:2号球,红色:3号球,淡蓝色:4号球,紫色:5号球,黄色:6号球。

黑色粗线:蓝球

大致看上去还有点规律样的···

预测:Python代码:把每个球的历史中奖号码传入。

import numpy as np
import sys

def prediction( num):
    N = len(num)

    b = num[-N:]
    b = b[::-1]

    A = np.zeros((N, N), int)

    for i in range(N):
        A[i,]=num
        num1=[]
        num1.append(num[N-1])
        for j in range(N-1):
            num1.append(num[j])
        num=num1

    (x, residuals, rank, s) = np.linalg.lstsq(A,b)
    # print x, residuals, rank, s
    return np.dot(b,x)

2015年4月6日的计算结果是2015039期:1,
2, 12 , 22, 28, 29, 9,实际开奖结果:1, 13, 15, 26, 29, 30,12。中两个号码···

误差计算:Java代码

/**
 * when you did your prediction
 * and the real numbers come out
 * you can run this method to figure out the error
 * so you can make the next prediction according to this error
 *
 *
 */

public class ErrorCalculate {

	private static Session session;
	Lottery lottery = new Lottery();
	Forecast forecast = new Forecast();
	ForecastError error = new ForecastError();

	public void errorCalculate(){

		//query the latest lottery information
		List lotteryList = null;

		try{
			session=HibernateUtils.getSession();
			session.beginTransaction();
			Query query = session.createQuery("from Lottery l where 1=1 order by l.date desc");
			query.setFirstResult(0);
			query.setMaxResults(1);
			lotteryList = query.list();
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}

		for (int i = 0; i < lotteryList.size(); i++) {
			lottery = (Lottery) lotteryList.get(i);

			//show the lottery's phase to make sure that the two phases are the same
			System.out.println(lottery.getPhase());
		}

		//query the latest forecasted information
		List forecastList = null;
		try{
			session=HibernateUtils.getSession();
			session.beginTransaction();
			Query query = session.createQuery("from Forecast f where 1=1 order by f.phase desc");
			query.setFirstResult(0);
			query.setMaxResults(1);
			forecastList = query.list();
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}

		for (int i = 0; i < forecastList.size(); i++) {
			forecast = (Forecast) forecastList.get(i);

			//show the forecast phase to make sure that the two phase are the same
			System.out.println(forecast.getPhase());
		}

		//The error calculate must be made while the latest lottery's phase is the same to the latest forecast's phase
		if(lottery.getPhase().equals(forecast.getPhase())){
			//calculate the error by the formula error = lottery - forecast
			error.setPhase(lottery.getPhase());  //use the lottery and the forecast phase as the phase of error
			error.setRed_1(lottery.getRed_1() - forecast.getRed_1());
			error.setRed_2(lottery.getRed_2() - forecast.getRed_2());
			error.setRed_3(lottery.getRed_3() - forecast.getRed_3());
			error.setRed_4(lottery.getRed_4() - forecast.getRed_4());
			error.setRed_5(lottery.getRed_5() - forecast.getRed_5());
			error.setRed_6(lottery.getRed_6() - forecast.getRed_6());
			error.setBlue(lottery.getBlue() - forecast.getBlue());
			//error.setLucky_blue(lottery.getLucky_blue() - forecast.getLucky_blue());

			System.out.println(error.getRed_1());
			System.out.println(error.getRed_2());
			System.out.println(error.getRed_3());
			System.out.println(error.getRed_4());
			System.out.println(error.getRed_5());
			System.out.println(error.getRed_6());
			System.out.println(error.getBlue());
			//System.out.println(error.getLucky_blue());

			//save the error into table error
			try{
				session=HibernateUtils.getSession();
				session.beginTransaction();
				session.save(error);
				session.getTransaction().commit();
				System.out.println("the error stored successfully");
			}catch(Exception e) {
				e.printStackTrace();
				session.getTransaction().rollback();
			}finally {
				HibernateUtils.closeSession(session);
			}
		}else{
			System.out.println("the phases of lottery and forecast are not same, please make the forecast or wait the next lottery comes out.");
		}

	}

2015年4月8日,再次运行Python预测算法,得到结果:1,
2, 13, 22, 28, 30, 9,怎么跟上次是差不多的啊,下次学着用其他方式试试。

时间: 2024-10-06 20:58:32

双色球预测的一次尝试的相关文章

双色球预测的一次尝试——修正

 经过三次计算,发现计算结果相差不大,所以觉得预测算法不够完善,现在还不知道如何使用其他的方式来预测,所以只能计算每次预测的误差平均值,在预测的时候加上这个误差平均值,看看效果(PS:今天4月10日预测出来的1号球居然是0····所以才想着用误差平均值来修正). 修改的Python代码如下: #查询误差数据 cursor.execute('select * from tb_error') errors = cursor.fetchall() red1Error = 0 red2Error =

python 之双色球预测

#encoding=utf-8 #这是一个易经的启卦程序,在windows下的python3.3下创建' #启卦要本着易的四原则,无事不占,不动不占,无疑不占.不能乱占. #预测原理是,随机生成一组6个红球号码,然后运行易经启卦程序,如果此结果 #为上上卦,那么这组号码就被打印出来,如果不是遇继续生成随机数,易经启卦原理我 #用 shell 写过一次了,这次是用python 又写了一次,思路是一样的,过程有差别,在 #shell 中主要是操作文件,在python中主要操作的是列表和字典. def

【原创】python基于大数据现实双色球预测

前提准备:利用sql筛选出每个球出现概率最高的前5个数 原理:先爬出所有的历史数据,然后模拟摇奖机出球的机制并大量模拟计算,直到出现列表中的某一个数后即停 注意事项:由于计算过程数据量很大,需要加入内存释放的操作 成果:目前博主最好记录是中了3红1蓝,适合学习交流使用,信则有 #coding=utf-8 import random import time import gc import datetime from collections import Counter try: dt = dat

双色球预测算法–红球行列断区法

行列断区法全称为行列断区转3D分析选号法,同样是由刘大军全新科学演绎并首次公开.简单地说,双色球红球号码33个,可以分为6行6列,如下图. 纵向看,33个红球分为6列,前三列每个列均含6个红球,后三列每个列均含5个红球. 经过统计每期开奖号码的红球,会发现一个有趣的现象: 开奖号码中的6个红球绝大多数分散出现在1~6列的其中4个列中,还有一部分出现在其中的3个或5个列中,最后是很少的部分出现在其中的6个列.2个列或1个列中,因为最后一种情况并不多见,完全可以忽略. 这个现象也就证明了在上面的图中

对双色球结果预测的一次无聊的尝试

今天晚上突然脑子不知怎么的,本来正在人工给12306验证码做打标工作,突然想看看双色球每期的开奖结果是否有规律 从这里下载从03年到今年的每期双色球开奖结果 用t-SNE降维到3维打印出来看看 似乎并没有什么规律 准备用线性回归来拟合一个模型,马上就有一个问题,对于双色球预测,自变量取什么?这是个非常复杂的问题了,而且可能是无解的问题,因为如果双色球是完全的独立随机事件,那也就无法提取出自变量,自然也就没法提取特征空间,这里姑且用开奖期号作为自变量特征,用结果(6维的红球结果,1维的蓝球结果)作

人工智能深度学习神经网络在双色球彩票中的应用研究

人工神经网络(Neural Networks)在双色球彩票中的应用研究网上已经有比较多的研究论文和资料,最近比较火的AlphaGo中用到的深度学习在双色球预测上还没有相关论文,以后研究成果出来将逐步更新内容. 人工智能神经网络是什么? 神经网络的好处就是可以自己纠正,可以自己生成节点,错误的输入也可以给你输出接近正确的结果.这个就是为什么叫做智能,他会自动根据情况跟人脑思维一样进行学习,进化而不是单纯的执行命令了. 普通过滤算法就是单线的执行,根据我的输入根据写好的逻辑算法直接给出输出,没有自动

Drupal 7 cache/缓存入门指南

使用Drupal构建复杂而动态的内容是件很容易的事情.但是稍有不慎,你会为这种容易付出代价.在用户查看某些复杂而动态的页面的时候,复杂的数据库查询,与高花销的计算会导致页面性能方面的问题. 解决方案之一是在Druapl的后台页面开启页面缓存.页面缓存开启后,可以在某些页面极大的降低数据库查询次数从而提高页面性能.但是这有一定的局限性,就是页面缓存仅仅对匿名用户有效.对应登录用户则会生效. 逐渐的,你可能会分析自己写过的代码,找出数据出查询的热点进行缓存优化.幸运的是,Drupal已经内置了一些缓

回归预测及R语言实现 Part2 回归R语言实现

下面是回归分析的各种变体的简单介绍,解释变量和相应变量就是指自变量和因变量. 常用普通最小二乘(OLS)回归法来拟合实现简单线性.多项式和多元线性等回归模型.最小二乘法的基本原理前面已经说明了,使得预测值和观察值之差最小. R中实现拟合线性模型最基本的函数是lm(),应用格式为: myfit <- lm(Y~X1+X2+-+Xk,data) data为观测数据,应该为一个data.frame,前面是拟合表达式,Y是因变量,X1-Xk是自变量,+用来分隔不同的自变量的,还有可能用到的其他符号的说明

YOLOv3 算法的详细说明

YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面.不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力. 本文主要讲v3的改进,由于是以v1和v2为基础,关于YOLO1和YOLO2的部分析请移步YOLO v1深入理解 和 YOLOv2 / YOLO9000 深入理解. YOLO3主要的改进有:调整了网络结构:利用多尺度特征进行对象检测:对象分类用Logistic取代了softmax. 新的网络结构Darknet-53 在基本的图像特征提取