【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现
阅读目录
- 1.马尔可夫链预测模型介绍
- 2.马尔可夫链的数学概念和性质
- 3.离散型马尔可夫链变量预测步骤
- 4.离散型马尔可夫链模型代码
- 5.实际案例
前言:彩票是一个坑,千万不要往里面跳。任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已。
已经3个月没写博客了,因为业余时间一直在研究彩票,发现还是有很多乐趣,偶尔买买,娱乐一下。本文的目的是向大家分享一个经典的数学预测算法的思路以及代码。对于这个马尔可夫链模型,我本人以前也只是听说过,研究不深,如有错误,还请赐教,互相学习。
1.马尔可夫链预测模型介绍
马尔可夫链是一个能够用数学方法就能解释自然变化的一般规律模型,它是由著名的俄国数学家马尔科夫在1910年左右提出的。马尔科夫过程已经是现在概率论中随机过程理论的一个重要方面。经过了一百年左右的发展,马尔可夫过程已经渗透到各个领域并发挥了重要的作用,如在我们熟知的经济、通信领域,除此之外在地质灾害、医疗卫生事业、生物学等自然科学领域也发挥了非常重要的作用。
人们在对实际问题的研究中会发现随着时间的持续发展变化会产生很多现象。还有一些现象或过程可以表述如下:在“现在”是已知的情况下,这种变化过程的“未来”与“过去”是毫无联系的。也就是说这种过程的未来所出现的情况不依赖于过去的发展变化,我们就把具有上述性质的过程称之为马尔可夫过程。马尔可夫过程可以描述现实生活中的很多现象。例如,我们熟知的液体中的颗粒所做的布朗运动、在商业活动中所要研究的每天销售情况、在数字通信中的语音信号、视频信号等。马尔可夫链在其他领域的应用还有很多,如在银行的不良资产的管理、机车管理、企业管理、生态环境演变、城市用水量仿真、信息处理等科学研究和生产生活中都有广泛应用。
2.马尔可夫链的数学概念和性质
定义1:
定义2:
上面是2个最简单的马尔可夫链的数学定义,看不懂没关系,简单解释一下:
1.从状态k到k+1与时间k无关,也就是说这个随机过程与时间k无关,而从k到k+1状态,有一个转移概率,马尔可夫链的核心其实也就是这个转移概率;
2.根据马尔可夫链的思想,一步转移概率Pij很容易得到,但是预测的时候,往往要根据最近K期的数据来进行,所以要计算K步转移概率;
3.任意步的转移概率可以根据C-K方程来计算,CK方程是一种计算转移概率的基本方法,简单的算法就是:通过一步转移概率矩阵P独自相乘m次,就可以得到m步转移概率。
4.马尔可夫链的思想,就是根据历史的数据,统计得到转移概率,然后根据滞时权重对每个状态进行预测,概率最高的是最可能出现的。
5.对于离散型马尔可夫链序列变量,一般计算之前需要对变量进行“马氏性”检验,统计量就是卡方分布。
6.马尔可夫链的研究还有很多其他的方面,比如状态分类,极限概率,平稳分布等等,这些太高级,没时间去搞很懂,这些对预测过程的精度是有一定影响的。
3.离散型马尔可夫链变量预测步骤
3.1 状态分类
对于离散型变量来说,首先要把目标的数据进行归类,对模型来说,一般状态都是有限的,比如说双色球,可以把16个篮球号码分为8个状态,2个一组。当然一些经济和实际生活数据的状态分类,就要根据实际情况了。
3.2 计算转移概率矩阵
转移概率矩阵是可以根据历史数据的频率f(i,j)统计得到。f(i,j)是状态i到状态j转移的次数;然后概率转移矩阵
p(i,j) = f(i,j)/f(i.) ;频数除以当前行的和值即为概率
3.3 "马氏性"检验
对于离散型的变量,需要利用历史数据进行“马氏性”检验。检验公式为:
然后根据显著性水平(程序中固定取0.05) ,查表求m自由度时的阀值,若 ,则满足 马氏性,可以进行下一步的预测,否则没有多大的意义。
3.4 计算自相关系数和各种步长的权重
若满足马氏性,就可以对下一个状态进行预测了,预测根据滞时k,有权重调整,权重W(k)是根据自相关系数R(k)计算得到的,公式如下:
k为滞时期,我程序测试里面选的5,L是总的历史数据次数,X是历史数据序列。
3.5 计算不同滞时期的转移概率矩阵
根据C-K方程提供的算法,计算k步的转移概率矩阵 Pi(k) ,又一次转移概率矩阵自乘 k次得到。
3.6 预测下一个状态
下一个状态的预测概率通过相同状态的各个预测概率加权和得到,计算用到公式:
最后一步的时候要注意,要根据最后k期的历史数据所在状态值和步长的权值相乘。滞时期为1的数据,是最后1期数据(最新的数据),这个循环的时候要注意,很容易掉进坑里。
4.离散型马尔可夫链模型代码
本文使用C#实现了简单的离散型马尔可夫链模型,在验证马氏性的时候,由于需要查表求值,所以暂时固定了自由度25,显著性水平0.05,模型核心代码:
1 /// <summary>离散型马尔可夫链预测模型</summary> 2 public class DiscreteMarkov 3 { 4 #region 属性 5 /// <summary>样本点状态时间序列,按照时间升序</summary> 6 public List<int> StateList { get; set; } 7 /// <summary>状态总数,对应模型的m</summary> 8 public int Count { get; set; } 9 /// <summary>概率转移矩阵Pij</summary> 10 public List<DenseMatrix> ProbMatrix { get; set; } 11 /// <summary>各阶的自相关系数</summary> 12 public double[] Rk { get; set; } 13 /// <summary>各阶的权重/summary> 14 public double[] Wk { get; set; } 15 /// <summary>频数矩阵/summary> 16 public int[][] CountStatic { get; set; } 17 /// <summary>目标序列是否满足"马氏性"/summary> 18 public Boolean IsMarkov { get; set; } 19 /// <summary>滞时期,K/summary> 20 public int LagPeriod { get; set; } 21 22 /// <summary>预测概率</summary> 23 public double[] PredictValue { get; set; } 24 #endregion 25 26 #region 构造函数 27 public DiscreteMarkov(List<int> data, int count,int K = 5) 28 { 29 this.StateList = data; 30 this.LagPeriod = K; 31 this.Count = count; 32 this.CountStatic = StaticCount(data, count); 33 this.ProbMatrix = new List<DenseMatrix>(); 34 var t0 = DenseMatrix.OfArray(StaticProbability(this.CountStatic).ConvertToArray<double>()); 35 ProbMatrix.Add(t0); 36 37 for (int i = 1; i < K; i++) //根据CK方程,计算各步的状态转移矩阵 38 { 39 var temp = ProbMatrix[i - 1] * t0; 40 ProbMatrix.Add(temp); 41 } 42 if (ValidateMarkov()) 43 { 44 CorrCoefficient(); 45 TimeWeight(); 46 PredictProb(); 47 } 48 else 49 { 50 Console.WriteLine("马氏性 检验失败,无法进行下一步预测"); 51 } 52 } 53 #endregion 54 55 #region 验证 56 /// <summary>验证是否满足马氏性,默认的显著性水平是0.05,自由度25</summary> 57 /// <returns></returns> 58 public Boolean ValidateMarkov() 59 { 60 //计算列和 61 int[] cp1 = new int[Count]; 62 int allcount = CountStatic.Select(n => n.Sum()).Sum();//总数 63 64 for (int i = 0; i < Count; i++) 65 { 66 for (int j = 0; j < Count; j++) cp1[i] += CountStatic[j][i]; 67 } 68 double[] cp = cp1.Select(n => (double)n / (double)allcount).ToArray(); 69 70 //计算伽马平方统计量 71 double gm = 0; 72 for (int i = 0; i < Count; i++) 73 { 74 for (int j = 0; j < Count; j++) 75 { 76 if (CountStatic[i][j] != 0) 77 gm += 2 * CountStatic[i][j] * Math.Abs(Math.Log(ProbMatrix[0][i,j] / cp[j], Math.E)); 78 } 79 } 80 //查表求a = 0.05时,伽马分布的临界值F(m-1)^2,如果实际的gm值大于差别求得的值,则满足 81 //查表要自己做表,这里只演示0.05的情况 卡方分布 82 return gm >= 37.65; 83 } 84 85 /// <summary>计算相关系数</summary> 86 public void CorrCoefficient() 87 { 88 double mean = (double)StateList.Sum() /(double) StateList.Count;//均值 89 90 double p = StateList.Select(n => (n - mean)*(n-mean)).Sum(); 91 92 Rk = new double[LagPeriod]; 93 94 for (int i = 0; i < LagPeriod; i++) 95 { 96 double s1 = 0; 97 for (int L = 0; L < StateList.Count - LagPeriod ; L++) 98 { 99 s1 += (StateList[L] - mean) * (StateList[L + i] - mean); 100 } 101 Rk[i] = s1 / p; 102 } 103 } 104 105 /// <summary>计算滞时的步长</summary> 106 public void TimeWeight() 107 { 108 double sum = Rk.Select(n=>Math.Abs(n)).Sum(); 109 Wk = Rk.Select(n => Math.Abs(n) / sum).ToArray(); 110 } 111 112 /// <summary>预测状态概率</summary> 113 public void PredictProb() 114 { 115 PredictValue = new double[Count]; 116 //这里很关键,权重和滞时的关系要颠倒,循环计算的时候要注意 117 //另外,要根据最近几期的出现数,确定概率的状态,必须取出最后几期的数据 118 119 //1.先取最后K期数据 120 var last = StateList.GetRange(StateList.Count - LagPeriod, LagPeriod); 121 //2.注意last数据是升序,最后一位对于的滞时期 是k =1 122 for (int i = 0; i < Count; i++) 123 { 124 for (int j = 0; j < LagPeriod; j++) 125 { 126 //滞时期j的数据状态 127 var state = last[last.Count - 1 - j] - 1; 128 PredictValue[i] += Wk[j] * ProbMatrix[j][state ,i]; 129 } 130 } 131 } 132 #endregion 133 134 #region 静态 辅助方法 135 /// <summary>统计频数矩阵</summary> 136 /// <param name="data">升序数据</param> 137 public static int[][] StaticCount(List<int> data, int statusCount) 138 { 139 int[][] res = new int[statusCount][]; 140 141 for (int i = 0; i < statusCount; i++) res[i] = new int[statusCount]; 142 143 for (int i = 0; i < data.Count - 1; i++) res[data[i]-1][data[i + 1]-1]++; 144 145 return res; 146 } 147 /// <summary>根据频数,计算转移概率矩阵</summary> 148 /// <param name="data">频率矩阵</param> 149 public static double[][] StaticProbability(int[][] data) 150 { 151 double[][] res = new double[data.Length][]; 152 for (int i = 0; i < data.Length; i++) 153 { 154 int sum = data[i].Sum(); 155 res[i] = data[i].Select(n => (double)n / (double)sum).ToArray(); 156 } 157 return res; 158 } 159 #endregion 160 }
调用方法很简单,如下代码:这里使用的是论文文献中的数据,单个号码的随机概率为16.6%,程序预测的概率可以到25-30%的样子,应该还有调整的空间。
1 //历史状态数据 2 List<int> data = new List<int>(){ 3 6,4,4,5,2,4,6,1,2,6, 5,6,4,4,6 , 5,3,6,5,2 , 5,3,3,4,4, 4 4,1,1,1,1,3,5,6,5,5, 5,5,4,6,5 , 4,1,3,1,3 , 1,3,1,2,5, 5 2,2,5,5,1,4,4,2,6,1, 5,4,6,3,2, 2,6,4,4,4, 4,3,1,5,3, 6 1,2,6,5,3,6,3,6,4,6, 2,4,4,6,3, 3,6,2,6,1, 3,2,2,6,6, 7 4,4,3,1,4,1,2,6,4,4, 1,2};//,6,4,3,6,2,5,5,5 8 9 var result = new DiscreteMarkov(data, 6,5);
5.实际案例
哈哈,请关注博客,年后将根据此算法,对高频彩快3和11选5进行实证分析。因为这个过程有点复杂,不是一下子可以搞定的。
本文的相关文字资料,公式和数据来源根据这篇文献:“马尔可夫链预测模型及一些应用”,2012.3 温海彬
最后,彩票风险很大,购彩需谨慎。你的热情和推荐,是我的动力哦。
补充一下,其中有一个扩展方法,进行数组转换的,忘记贴上去了:
1 public static T[,] ConvertToArray<T>(this T[][] data) 2 { 3 T[,] res = new T[data.Length, data[0].Length]; 4 for (int i = 0; i < data.Length; i++) 5 { 6 for (int j = 0; j < data[i].Length; j++) res[i, j] = data[i][j]; 7 } 8 return res; 9 }本文转自数据之巅博客园博客,原文链接http://www.cnblogs.com/asxinyu/p/3532076.html,如需转载请自行联系原作者
【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现相关推荐
- 深度置信网络预测算法matlab代码_深度学习双色球彩票中的应用研究资料
点击蓝字关注我们 AI研习图书馆,发现不一样的世界 深度学习在双色球彩票中的应用研究 前言 人工神经网络在双色球彩票中的应用研究网上已经有比较多的研究论文和资料,之前比较火的AlphaGo中用到的深度 ...
- 基于离散Markov模型的Web用户行为预测算法的研究
目录 一.理论基础 二.案例背景 1.问题描述 2.思路流程 三.部分MATLAB程序 四.仿真结论分析 五.算法相关应用 六.参考文献 一.理论基础 对于 Kth -Markov 模型,常见的建模算 ...
- 预测算法-线性回归(鲍鱼年龄预测)
预测算法-线性回归 面对可逆矩阵 线性回归(模型,策略,算法) 模型: h(x)=WTx+b h ( x ) = W T x + b h(x) = W^T x + b 损失函数: J(θ)=∑i=1N ...
- python 彩票预测算法_Python爬虫之爬取彩票并简单统计
一.背景 在网上闲逛的日子总归是无聊的,百度的跟踪也是一如既往的好,它总是会给我推荐一些互联网圈里面的新闻,然后又在其中穿插一些新游戏广告,正因如此,我看到了一篇报道某个地方某个人中了五百万大奖的新闻 ...
- 人工智能-强化学习-算法:Critic 【用于评价一个 Actor/Policy π】--> Q-Learning【用于训练出来一个最优 Actor/Policy π,擅长处理离散型 actions】
一.Critic的作用 Critic就是一个神经网络,以状态 s s s 为输入,以期望的Reward为输出. Critic的作用就是衡量一个Actor在某State状态下的优劣.Given an a ...
- 分类型变量预测连续型变量_SPSS中的Variable数据变量类型介绍,一次性弄清无序分类变量、有序分类变量、 离散型数值变量、连续型数值变量的区别!...
变量的概念:变量也就是就是一种可以进行测量的数据条目(data item),对于定义变量在统计里非常重要,特别是在进行SPSS分析的时候,需要明确定义一个变量的性质.打开SPSS软件时,数据录入界面上 ...
- 多取值离散型特征工程_特征工程(完)
机器学习入门系列(2)--如何构建一个完整的机器学习项目,第六篇! 这也是特征工程系列最后一篇文章,介绍特征提取.特征选择.特征构建三个工作,通常特征工程被认为分为这三方面的内容,只是我将前面的数据& ...
- C4.5(决策树预测)算法
2019独角兽企业重金招聘Python工程师标准>>> 决策树<Decision Tree>是一种预测模型,它由决策节点,分支和叶节点三个部分组成.决策节点代表一个样本测 ...
- 11种离散型变量编码方式及效果对比
首先介绍一个关于离散型编码的Python库,里面封装了十几种(包括文中的所有方法)对于离散型特征的编码方法,接口接近于Sklearn通用接口,非常实用.下面是这个库的链接:Category Encod ...
- ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介、损失函数/代价函数/目标函数之间区别、案例应用之详细攻略
ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介.损失函数/代价函数/目标函数之间区别.案例应用之详细攻略 目录 损失函数的简介 损失函数/代价函数/目标函数之间区别 损失 ...
最新文章
- RPC框架实践之:Apache Thrift
- 本地配置文件git提交
- 开发日记-20190401
- 分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵
- 生成颜色代码的 Java程序
- 为什么要选择基于NAS存储方案
- git status怎么操作_Git 基本操作
- 03-05 APP自动化测试-常用定位方式
- java xml 面试_Java程序员面试常见的10道XML面试题
- 使用 mod_rewrite 来修改 Confluence 6 的 URLs
- sequel pro 格式化sql
- 米家有品这么多好东西哪些值得我们关注
- 软件测试 - 软件测试流程(完整版)避免当背锅侠,测试人的生存......
- 抖音3d照片怎么制作html,抖音3D卡通小人是什么app软件 怎么制作方法介绍
- expire_logs_days
- 压缩后图片不清楚了怎么办?
- web前端工程师需要掌握哪些知识
- 软件测试面试题汇总(二)
- [Go] go基础4
- 【报错管理】can only concatenate str (not float) to str