Datawhale_数学建模导论_笔记
task1
6.1
信息的不同形式——“模态”
-
数值类
-
文本类
-
图像类
-
音频类
-
信号类
可以用来做数学建模,进行“数化”操作,个人认为是记录(转化为)重要数据信息。
对于一个事物,往往要用不同模态去做描述;也由此出现了“多模态模型”——用于建模
6.2
把混乱、不全面的原始数据处理成有效、有特征的数据
——数据的预处理
-
数据和特征决定处理效果的上限
-
模型和算法是为了逼近这个上限
对于一个数据集(excel为例)
表格的体量是它有多少行多少列,如果列数超过了行数的1/2就可以说是有些稀疏了,如果列数是行数的3倍那它就是严重稀疏的数据。
对缺失数据项的处理1——填充
方法:常数填充、均值填充
那些py例子都运行了一遍,了解了pd的DataFrame的对象的用法
.interpolate()
:
pandas的插值方法,用于填补缺失值
-
默认线性插值,用前后已知值的平均值来填补
-
只对数值型数据有效
.astype(int)
把插值后的数据值强制转换成整数类型
import pandas as pd
import numpy as np
"""
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat','snake', 'cat', 'dog', 'dog'],'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no','yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data)
#print(df.describe())#只返回数值类型的数据信息——个数、平均之类的内容
#print(df.head(5))#前5个数据
#print(df[['animal']])#df[[]] / df[]
#print(df.loc[[3,4,8], ['animal','age']])#df.loc[行,列]
#print(df.loc[df['visits']==3, :])#通过特定行值选行
#print(df.loc[df['age'].isna(), :])#同上,这个是选age值为空的
df.loc[(df['animal']=='cat'& (df['age']<3), :]
df.loc[(df['age']>=2)&(df['age']<=4), :]
#修改
df.index = labels
df.loc[['f'],['age']] = 1.5
#求和
df['visits'].sum()
#计平均值
df.groupby(['animal'])['age'].mean()#每种animal的age平均值
"""
df = pd.DataFrame({'From_To': ['LoNDon_paris', 'MAdrid_miLAN', 'londON_StockhOlm','Budapest_PaRis', 'Brussels_londOn'],'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],'Airline': ['KLM(!)', '<Air France> (12)', '(British Airways. )','12. Air France', '"Swiss Air"']})
#print(df)
df['FllightNumber'] = df['FlightNumber'].interpolate().astype(int)#线性
temp = df['From_To'].str.split("_", expand=True)
temp.columns = ['From', 'To']#改列值
#首字母大写
temp['From'] = temp['From'].str.capitalize()
temp['To'] = temp['To'].str.capitalize()
#print(temp)
#From_To ==> From, To
df.drop('From_To', axis=1, inplace=True)
df[['From', 'To']] = temp
#清除特殊字符
df['Airline'] = df['Airline'].str.extract(r'([a-zA-z\s]+)', expand=False).str.strip()
#比较
print(df['RecentDelays'])
#把RecentDelays中的数组值
delays = df['RecentDelays'].apply(pd.Series)#Series——一维数组,
#把每行的RecenDelays列表展成一维数组
#print(delays)
delays.columns = ['delay_%s' % i for i in range(1, len(delays.columns)+1)]
df = df.drop('RecentDelays', axis=1).join(delays, how='left')#axis=1表示,left表示以原表的行顺序为准
#print(df)
#填补平均值
for i in range(1, 4):df[f'delay_{i}'] = df[f'delay_{i}'].fillna(np.mean(df[f'delay_{i}']))
#print(df)
#add
print(df)
df = df._append(df.loc[df['FlightNumber'] == 10085, :], ignore_index=True)
print(df)
#去重
df = df.drop_duplicates()
print(df)
规约方式
min-max规约
==> 实现消除量纲的影响,范围缩为[0,1],减小数据偏差
当出现某个非常大的异常数值时,上面的方法会导致数据的分别异常
这时用Z-score规约
——一列数据-其均值,再除以标准差
6.3
-
回归分析——因变量为连续变量
-
分类分析——因变量为属性变量
假设检验
对假设检验问题进行数理上的检验,bi并给予回答
——这个过程是假设检验,通过样本验证样本所在总体的性质
-
参数假设检验:用参数来进行操作
-
非参数假设检验
-
正态性检验
-
单组样本均值假定检验
-
两组样本的均值相等性检验
-
成对检验:
-
总体服从正态分布,使用成对t检验
-
不服从,则使用成对wilcoxon秩和检验
-
-
-
方差分析-多组样本间的均值相等性检验
-
样本间均值的差异程度 / 样本内差异程度
-
使用kruskalwallis检验(一种非参数检验)
-
随机过程与随机模拟
随机变量的分布情况按照时间变化的性质,通过随机过程来描述
——随机过程 = 随机变量+时间维度
simpy进行仿真
6.4
目的:提高对分析结论时的可读性,同时使信息更全面
学习下面python库的使用
-
Matplotlib
-
Seaborn:对Matplotlib的补充
-
Plotnine:与上面的区别——上面是一笔一笔的画,这个是添加一个图层
基本图标Quick Start
-
类别型图表:通常X为类别型数据,Y为数值型数据
-
关系型图表:X数值与Y数值之间的关系(数值型关系、层次型关系和网络型关系)
-
分布型图表:表达疏密程度的
-
时间序列型图表
6.5
线性插值法
通过这个表达式来赋值,建模
三次样本插值
两个数据点间填充模式设置为三次多项式,获得一个三次式,满足上面的式子,及其一阶、二阶求导式子,通过这个式子来插值(插补这两个数据点间的数据)
拉格朗日插值
实现函数
def lagrange(x0,y0,x):y=[]for k in range(len(x)):s=0for i in range(len(y0)):t=y0[i]for j in range(len(y0)):if i!=j:t*=(x[k]-x0[j])/(x0[i]-x0[j])s+=ty.append(s)return y
通过给出的点集,利用拉格朗日函数生成一个x,y的函数(n次)
之后通过给出x直接求y
但可能随着项次的提高,曲线会剧烈振荡,导致插补不准确。
文章参考于https://www.datawhale.cn/learn/content/85/3036