首页 > 编程知识 正文

大小球预测模型,什么是数学建模能力

时间:2023-05-03 10:12:46 阅读:148233 作者:1153

双色球概率预测模型数学建模预测模型实例(1)大学生体测数据模型

数学建模预测模型实例(2)表白墙影响力量化模型

python预测算法-线性回归

双色球概率预测模型

前言新晋彩民痴情的店员最近对双色球非常感兴趣,买了几个随机号码中奖,但没有结果后,决心专心修炼,寻找更可靠的预测方法。 所以,有了这篇文章,文章的构思和结果只有娱乐。 请不要信以为真。

建模构想想到这个想法后,我首先调查了网上各种双色球预测模型,发现了几个有代表性的东西:

1 .基于神经网络的回归预测模型

基于LSTM的预测模型

3 .基于深度学习的预测模型

你觉得看这三种预测模型很高级吗? 是的! 我也是这样的! 于是我又开始了新的资料检索。 这次我去详细了解了关于双色球的概率知识。

关于双色球的概率知识双色球由红球和蓝球两部分组成,红球从0.1到33的号码中选择,蓝球从0.1到16的号码中选择。 每次颁发奖金时,在红色球中随机分配6个红色号码,在蓝色球中随机分配1个蓝色号码。

这里以一等奖为例,双色球不一次性放回样品很容易理解,计算其概率需要高中数学概率计算:

由此可见,1700万分之一的一等奖的概率有多么低; 另外,双色球作为一个完全随机的过程,我们获得的信息非常有限,只能根据历史数据所反映的大致概率分布来建模,但各学习算法的操作对象要么是连续变化的,要么是按时间顺序高度的

在相关数据中,双色球不符合这个条件。

因此,我最终没有通过应用或改进现有算法来预测结果,而是选择了概率。 这唯一的玄学取向看起来不那么明显。

如果只考虑概率这个方向的话,就不得不与每个特定的日期双色球的可组合当选概率是否不同这一日期有联系。 由此我们得到了我们的科学问题。

探索性数据分析至此确定大方向为概率后,我立即着手观察数据。

此次实验获取到的数据为2003-2020.8月的双色球历史一等奖的中奖数据。

通过观察数据预处理,我认为这种数据的表现方式不直观。因此我选择将七个球的中奖数据分割开,由于每一种球的每一次抽取都有33(红)或16(蓝)种可能,我将每一可能作为一列,以1,0来表示是否中奖,具体如下图(以红色1号球为例)。

defprocess_df(df_w_1) : ' '在该步骤中,根据33 (红)/16 (蓝)种类的可能性,将各球的过去的获奖数据存储在二元一' ' ' ball=np.arange(1 )

1号-33号这33个可能性显示了在各日期的当选情况!

历史趋势可视化为了得到进一步的建模思路,我选择对历史数据中的每个球的获奖号码进行可视化的分析。结果如下(这里只选取其中四个球的结果进行展示)。

defdraw(df_w_1) : ' '历史获奖趋势(' ' sum_list=[]ball=NP.Arange ) 1,34 ) for在数据搜索阶段获得了7个球的33/16种结果

看了上面的图表,我再次确信概率这条路一定能走下去!

上图只选取了三个红球和一个蓝球的历史数据趋势作为展示,横坐标为一个球可能的33(红)或16(蓝)种结果,纵坐标为每一种可能结果中奖的计数。上图较好地反映了在大量的历史数据中确实存在一定的中奖倾向,由此每个球可能的中奖概率不同。

到目前为止还没有明确具体的想法,所以我认为不应该只关注当选结果。 没有当选的结果也值得同样关注,但除此之外还有日期和它们的关系。

日期和获奖可视化考虑到数据点数量太多可能不利于我们观察,在这里我随机选取了2581条数据中的100条进行接下来的数据探索。

导入会话

rn as snsimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False sns.set(font='SimHei')data['month']=data['日期'].dt.monthdata['day']=data['日期'].dt.daydata1=data[['day','3号']]train_,test_ = train_test_split(data1,test_size=100)sns.catplot(x='3号',y='day',data=test_)


上图展示的是1号红球的号码3的获奖结果与我们的天数的分布。

这张图是不是看着很像一个聚类数据?没有获奖的结果与天数并没有呈现这样的分群分布,因此观察到这种不寻常现象的我决定深入下去。

既然获奖结果与天数呈现一定程度上的分群,那么如果我们可以利用这种分群把一个月31天划分为几个区间,通过区间内获奖概率进行赋值,再加上每一天的获奖概率,那么一个月31天就被划分为了31个方格,每一个方格都有自己的分值,分值越高则该号数获奖可能性越高,换言之,我们的模型思路出来了!

系统思路


在这里还想解释一下p1,因为我们的训练数据是随机选取的100条数据,所以这里的天数我们暂时通过p1打一个标记(现在姑且认为是幸运数字的奖励吧!)

好了,现在系统思路都出来了!我们就开始代码实现吧!

代码实现 选定聚类个数k def select_k(x): ''' 聚类时选定最佳聚类个数k ''' SSE=[] k_=[] for k in range(1, 9): estimator = KMeans(n_clusters=k) estimator.fit(x) SSE.append(estimator.inertia_) for i in range(len(SSE)): if i+1<len(SSE): if SSE[i]-SSE[i+1]<=20: k_.append(i+1) return k_[0] 按照三个标准进行赋分 def process_data(namef,test_,data): ''' 按照三个标准进行赋分 ''' num_list=[] everyday_p=[] day_data = pd.DataFrame(pd.read_excel(r'C:Users15643Desktophistory_data.xlsx',sheet_name='Sheet1')) for m in range(len(namef)): try: na = namef[m] test_na = test_.loc[test_[na]==1] x=test_na['day'] x = np.array(x) x = x.reshape(-1, 1) k = select_k(x) ####kmeans聚类 kms = KMeans(n_clusters=k) kms.fit(x) day_list = np.arange(1,32) day_list_ = day_list.reshape(-1, 1) y = kms.predict(day_list_) ####对于训练数据里的天数赋值p1=0.1 day_data_col = namef2[:31] day_data.columns = day_data_col for l in range(len(x)): for j in range(0,31): if x[l]==j+1: day_data.iloc[m,j]=1.1 ###计算区间获奖概率p2并赋值给区间内每一天数 ###计算每一天获奖概率p3 for day in day_list: c = data.loc[data['day']==int(day)] num = len(c) num_list.append(num) y =pd.DataFrame(y) y['day']=pd.DataFrame(day_list) y['num']=pd.DataFrame(num_list) y.columns=['classify','day','num'] everyday = y['num'] for i in range(k): l=y.loc[y['classify']==i] l_num =l['num'].sum(axis=0) l_f = l_num/y['num'].sum(axis=0) y['classify']=y['classify'].replace(i,l_f) cls = y['classify'] for i in range(31): everyday_p.append(everyday[i]/y['num'].sum(axis=0)) ###输出每一天数对应的概率总和p=p1+p2+p3 day_data.iloc[m,i]=day_data.iloc[m,i]+cls[i]+everyday_p[i] except: pass return day_data 调用之前的所有函数 def data(data,data_w1): ''' 调用之前的所有函数 ''' data['month']=data['日期'].dt.month data['day']=data['日期'].dt.day data = data.drop(['日期'],axis=1) name = data.columns namef=name[1:17] train_,test_ = train_test_split(data,test_size=100)#在总共2581个数据中随机选取100个数据进行聚类分析 day_f = process_data(namef,test_,data) return day_f 输出结果 data_w1 = process_df(df_w_1)data_w2 = process_df(df_w_2)data_w3 = process_df(df_w_3)data_w4 = process_df(df_w_4)data_w5 = process_df(df_w_5)data_w6 = process_df(df_w_6)w1=data(data_w1)w2=data(data_w2)w3=data(data_w3)w4=data(data_w4)w5=data(data_w5)w6=data(data_w6)def select_whiteb_ball(day): ''' 根据输入日期输出最佳组合的函数 ''' result=[] col=int(day) w1_s = w1.iloc[:,col] w2_s = w2.iloc[:,col] w3_s = w3.iloc[:,col] w4_s = w4.iloc[:,col] w5_s = w5.iloc[:,col] w6_s = w6.iloc[:,col] b_s = b.iloc[:,col] w1_s=np.array(w1_s) w2_s=np.array(w2_s) w3_s=np.array(w3_s) w4_s=np.array(w4_s) w5_s=np.array(w5_s) w6_s=np.array(w6_s) b_s = np.array(b_s) w1f=np.argwhere(w1_s == w1_s.max()) w2f=np.argwhere(w2_s == w2_s.max()) w3f=np.argwhere(w3_s == w3_s.max()) w4f=np.argwhere(w4_s == w4_s.max()) w5f=np.argwhere(w5_s == w5_s.max()) w6f=np.argwhere(w6_s == w6_s.max()) bf=np.argwhere(b_s == b_s.max()) result.append([int(w1f)+1,int(w2f)+1,int(w3f)+1,int(w4f)+1,int(w5f)+1,int(w6f)+1,int(bf)+1]) print('推荐您的最佳组合为:{}'.format(result)) 最终结果

结果分析

根据最后的结果我发现
p1=0.1
0.1<p2<0.2
p3<0.1
所以我们对这三个赋分标准进行重要性排序

1.聚类区间中每种球每种可能性获奖概率p2
2.幸运数字加持p2
3.每一天每种球每种可能性获奖概率p3

最后结果选择就是以输入天数下所对应的各球各可能性的得分,得分越高,说明该种可能越有可能获奖。

模型不足

1.对于无法找到聚类个数k的各球各可能性的数据,现阶段还无法进一步分析
碍于本人知识储备不足,实乃大憾!
2.结果可能相对固定,不像应用成熟算法的模型可以有较强的灵活性
3.模型还是不靠谱!仅供娱乐!哈哈哈哈!希望大家玩的开心!

数据及源码获取 提取码:bwlw
最后希望大家看完这篇文章后能多多支持奇趣多多!
你们的关注是对我们最大的鼓励!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。