数学建模笔记总结

简介: 预测模型:神经网络预测、灰色预测、拟合插值预测(线性回归)、时间序列预测、马尔科夫链预测、微分方程预测、Logistic 模型等等。

image.png

数学建模三大模型


1、预测模型

预测模型:神经网络预测、灰色预测、拟合插值预测(线性回归)、时间序列预测、马尔科夫链预测、微分方程预测、Logistic 模型等等。


应用领域:人口预测、水资源污染增长预测、病毒蔓延预测、竞赛获胜概率预测、月收入预测、销量预测、经济发展情况预测等在工业、农业、商业等经济领域,以及环境、社会和军事等领域中都有广泛的应用。


预测模型:难度中等。


拟合插值预测:基础简单、容易理解。


拟合算法:matlab拟合工具箱、准确...

插值算法:短期预测、完善补全数据、插值函数、拉格朗日插值法、三次样条插值法...

神经网络预测:现代优化算法、考验编程能力。


人口预测:灰色预测、Logistic 模型...


2、优化模型

优化模型:规划模型(目标规划、线性规划、非线性规划、整数规划、动态规划)、图论模型、排队论模型、神经网络模型、现代优化算法(遗传算法、模拟退火算法、蚁群算法、禁忌搜索算法)等等。


应用领域:快递员派送快递的最短路径问题、水资源调度优化问题、高速路口收费站问题、军事行动避空侦察的时机和路线选择、物流选址问题、商区布局规划等各个领域。


优化模型:偏难。


切割木料、地板,使损耗最低、利润最高。


自然水管道铺设问题:图论模型(迪杰斯特拉算法 Dijkstra、克鲁斯卡尔算法 Kruskal)


3、评价模型

评价模型:模糊综合评价法、层次分析法、聚类分析法、主成分分析评价法、灰色综合评价法、人工神经网络评价法等等。


应用领域:某区域水资源评价、水利工程项目风险评价、城市发展程度评价、足球教练评价、篮球队评价、水生态评价、大坝安全评价、边坡稳定性评价。


预测模型:偏简单。


数学建模的十大常用算法

image.png  


遗传算法、模拟退火算法重要


数学建模方法导图:

image.png

image.png

image.png



Python数据分析  


一、生成pandas

image.png

(1) pd.Series


import numpy as np
import pandas as pd
a = pd.Series([1, 3, 6, 'orange'])
print('pandas和字典有点像', a)

(2) pd.DataFrame


(a)以数组形式生成

# 生成6个日期行索引号
datas = pd.date_range('20190403', periods=6)
# 生成有6行4列行索引(index)和列索引(columns)的pandas
df = pd.DataFrame(np.random.random(size=(6, 4)), index=datas, columns=['a', 'b', 'c', 'd'])
print('生成有6行4列行索引(index)和列索引(columns)的pandas:\n', df)

image.png

(b)以字典形式生成

# 以字典方式生成pandas,其中AB为列索引
df2 = pd.DataFrame({'A': 1, 'B': 2.}, index=np.arange(2))
print('以字典方式生成pandas\n', df2)

image.png


二、dataframe的基本属性

image.png


三、索引值和修改dataframe

image.png

# 1、pandas索引
print('选中df的a列\n', df['a'], df.loc[:, 'a'], df.iloc[:, 0], df[0])
print('选中df的第0行\n', df.iloc[0], df.loc['2019-04-03'],df[0:1])
print('选df的135行,12列', df.iloc[[1, 3, 5], 1:3], df.ix[[1, 3, 5], ['a', 'b']])
print('索引df的a列中大于0.5对应的行', df[df['a'] > 0.5])
# 2、通过索引改变pandas的值
df.iloc[2, 2] = 'orange'
df.iat[2,2] = 'orange'
df.loc['2019-04-03', 'a'] = 'apple'
# 3、将df的b列大于0.3对应的行令为0
df[df.b > 0.3] = 0
# 4、将df的d列大于0.5对应的元素令为0
df.d[df.d > 0.5] = 0
# 5、增加一列e和f
df['e'] = 6
# 6、增加一行
s2 = pd.Series(np.arange(4), index=df.columns)
res = df3.append(s2, ignore_index=True)


四、运算(排序、统计、累加、判等)

image.png


五、处理丢失数据(如nan数据)

image.png

存在任一丢失数据,返回True

注意: 1.how='any'存在任意一个nan就丢,how='all'该列全部为nan才丢

2.NaN值不参与计算


六、合并

image.png

 注意:在concat里面axis=0,上下合并;axis=1,左右合并,不写默认axis=0; concat既可以上下又可以左右合并, append只能上下合并, merge只能左右合并

1、concat和append


df4 = pd.DataFrame(np.ones((3, 4)), columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df5 = pd.DataFrame(np.ones((3, 4))*2, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
res1 = pd.concat([df4, df5],axis=0, ignore_index=True)
res2 = pd.concat([df4, df5], join='inner')
print("res1:上下合并,忽略原索引,缺失补Nan:\n",res1, '\n',  "res2:上下合并,只合并共有列:\n",res2, '\n')
res3 = pd.concat([df4, df5], join='inner',axis=1)
print("res3:左右合并,忽略原索引,缺失补Nan:\n",res3)
res4 = df4.append([df4,df5], ignore_index=True)
print("append方式上下合并:\n",res4)
s2 = pd.Series(np.arange(4), index=df4.columns)
res5 = df4.append(s2, ignore_index=True)
print("append方式增加一行:\n",res5)

image.png


2、merge合并,左右合并


# 只有一个key
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'C': ['C0', 'C1', 'C2', 'C3'],
                     'D': ['D0', 'D1', 'D2', 'D3']})
# 以key的columns为基准合并
res6 = pd.merge(left, right, on='key')
print(res6)
# 考虑有两个key
left1 = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                      'key2': ['K0', 'K1', 'K0', 'K1'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']})
right1 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                       'C': ['C0', 'C1', 'C2', 'C3'],
                       'D': ['D0', 'D1', 'D2', 'D3']})
# how='inner'合并key1key2都相同的,how='outer'都合并,没有补nan
res7 = pd.merge(left1, right1, on=['key1', 'key2'], how='inner')
print(res7)
# 以key为基准合并,但考虑相同索引可能背后意义不同,故予以分别显示、
boys = pd.DataFrame({'K': ['K0', 'K1', 'K2'],
                     'age': [1, 2, 3]})
girls = pd.DataFrame({'K': ['K0', 'K0', 'K3'],
                     'age': [4, 5, 6]})
res9 = pd.merge(boys, girls, on='K', suffixes=['boy_age', 'girl_age'], how='inner')
print(res9)

运行结果:

只有一个key, pd.merge(left, right, on=‘key’)

image.png

2)有2个key(key1,key2), pd.merge(left1, right1, on=[‘key1’, ‘key2’], how=‘inner’)

how='inner'合并key1key2都相同的,how='outer'都合并,没有补nan

image.png


2.按照行索引合并

image.png


补充:merge合并小技巧

比如特征一个是以小时为粒度的,如天气预报,一个以15min为粒度,我们需要将两个特征合并,就需要对天气做扩充,merge的小技巧就是提取二者时间的小时,做合并,这样天气数据就会自动填充为15min

left1 = pd.DataFrame({'time':['2021-01-02 00:00:00', '2021-01-02 00:15:00'],
                      'time_hour': ['2021-01-02 00', '2021-01-02 00'],
                      'pelec': [2,2.5]})
right1 = pd.DataFrame({'time': ['2021-01-02 00:00:00'],
                      'time_hour': ['2021-01-02 00'],
                       'pelec': ['晴']})
res7 = pd.merge(left1, right1, on=['time_hour'], how='inner')
print(res7)


七、文件的存取

image.png

image.png

4)若分割符不标准

有多个长度不等的空格分割,我们采用正则表达式

pa.read_t

image.png


6)保存文件:

index=False不写入行索引,header=None不写列标签,columns=['a','b']只写ab列,sep='|'以竖线分割。

image.png



八、时间日期:

8.1 生成时间序列

时间日期在Pandas里的作用:


分析金融股票交易数据

分析服务器日志

image.png

1) pd.date_range 生成时间戳时间序列

pandas生成时间序列,可作为DataFrame或Series的index

image.png



8.2 时间重采样

高频——>低频:降采样,例:5Min股票交易数据转为日交易数据

低频——>高频:升采样

其他重采样:每周三(W-WED)转换为每周五(W-FRI)

image.png

注意:降采样,一般要带上方法,如.sum,how='mean'等

    升采样要带上插值方法



"""重采样"""
"""分钟股票交易数据"""
ts=pd.Series(np.random.randint(0,50,60),index=pd.date_range('2016-4-25 09:30',periods=60,freq='T'))
///降采样
///1)1天一采变为5天采样
ts.resample('5min',how='sum',label='right')
ts.resample('5min',how='ohlc')
///2)"""将天改为月份重采样"""
ts=pd.Series(np.random.randint(0,50,100),index=pd.date_range('2016-4-25',periods=100,freq='D'))
   //方法1:lambda函数
ts.groupby(lambda x:x.month).sum()
  //方法2:将时间戳转为时期
ts.groupby(ts.index.to_period('M')).sum()
"""升采样"""
///"""'W-FRI以周为单位,周五为一周的结束"""
ts=pd.Series(np.random.randint(0,50,2),index=pd.date_range('2016-4-2',periods=2,freq='W-FRI'))
///以周为单位,转为以天为单位,向前插值,最多前插三个
ts.resample('D',fill_method='ffill',limit=3)
"""其他重采样"""
///"""将每周五时间转为每周一"""
ts.resample('W-MON',fill_method='ffill')
九、groupby分组计算
分组  函数
df.groupby(索引列表).sum()  列表分组
支持迭代  for 组名, 组 in df.groupby(索引列表):
通过字典映射分组  mapping = {‘a’:red, ‘b’:‘red’, ‘c’:blue, ‘d’:‘orange’, ‘e’:‘blue’},df.groupby(mapping, axis =1)
通过函数分组  df.groupby(len)
多级索引通过索引级别分组  df.groupby(level=, axis= )


九、聚合函数

1)内置聚合函数

上图中的.mean()就是聚合函数,此外还有


df.groupby().describe()# 包含所有内置函数结果

df.groupby().min()

df.groupby().max()

df.groupby().mean()

df.groupby().sum()

image.png


目录
相关文章
|
7月前
这是最全的数学建模资料了吧?
这是最全的数学建模资料了吧?
51 0
|
数据采集 数据可视化 BI
matlab数学建模方法与实践 笔记2:数据的准备
matlab数学建模方法与实践 笔记2:数据的准备
148 0
|
7月前
|
机器学习/深度学习 算法 数据可视化
面向萌新的数学建模入门指南
面向萌新的数学建模入门指南
247 0
|
7月前
【数学建模竞赛】Matlab入门讲解
【数学建模竞赛】Matlab入门讲解
42 0
|
数据采集 机器学习/深度学习 数据可视化
matlab数学建模方法与实践 笔记汇总(上)
matlab数学建模方法与实践 笔记汇总
118 0
|
定位技术
数学建模概论
数学建模概论
|
数据采集 算法 数据挖掘
数学建模3:2012A
数学建模3:2012A
61 0
|
机器学习/深度学习 算法 数据挖掘
matlab数学建模方法与实践 笔记汇总(下)
matlab数学建模方法与实践 笔记汇总
95 0
|
存储 C语言
MATLAB笔记总结(1) 东华大学MOOC
MATLAB笔记总结(1) 东华大学MOOC
90 0
|
机器学习/深度学习 算法 数据可视化
数学建模资料整理
数学建模中有三类团队: 第一类:拿到题目,讨论,然后建模手开始建模,编程手开始处理数据,写作手开始写作。 第二类:拿到题目,团内大佬,开始建模,然后编程,然后写作。剩下两人负责探听别队的消息和带饭。 第三类:拿到题目,三个人一脸懵逼,不求同年同月同日生,但求同年同月同日死数学建模又称语文建模
447 0