#我是一个刚学习数学建模不久的小菜鸡,将自己的学习过程中收获的经验分享给大家,让刚入门的朋友知道什么是数学建模,了解一些基本的模型,库,内置函数,以及如何分析代码,做一些简单的数据拟合,模型预测#
一、什么是数学建模
数学建模就是用数学语言和方法来描述、理解和解决现实世界中的问题的过程,建立基本的数学模型,来做一些分析和预测的工作。
一般包括以下几个步骤:
- 明确问题:首先要清楚地定义要解决的问题是什么。
- 收集数据:找到与问题相关的数据,比如过去的销售记录、市场调研结果等。
- 建立模型:用数学公式或算法来描述这些数据之间的关系。
- 求解模型:通过计算找出最优解或者预测结果。
- 验证模型:将模型的预测结果与实际情况进行比较,看看是否准确。
- 改进模型:根据验证的结果调整模型,使其更加贴近实际情况。
以我的理解就是,将实际问题转化为一系列公式,通过公式使我们现实世界具象化,之前看过一个科幻电影里面就是讲一个科学家推出了我们现实世界发展的一套公式,可以预测某个人在将来的某段时间会做什么,预测他二十年后的发展,想想就很可怕是吧,但是只存在于科幻电影,现实就不太可能了哈。
二、线性回归
线性回归就是一个最简单,最直观的方法建立模型,现实世界的数据一般都是很复杂,之间的关系也是很微妙的,一般不支持线性回归,只能使用更复杂的模型去拟合数据。先带大家了解最简单的模型。
一般的线性方程,对于单一特征建立的方程就像 y = kx + b,多特征数据建立的方程就像 y = ax1 + bx2 + c,这种方式简单直观但是一般情况下拟合效果都不是很好。
废话少说,下面就带大家走进代码,让大家运用线性模型进行数学建模。
2.1 代码分析
import numpy as np
from sklearn.linear_model import LinearRegression # 用于执行线性回归
首先导入numpy,对numpy这个库不熟悉的同学可以自行找网课听一下,不过在这里,大家只需要知道numpy是一个数据处理的库就行,numpy对有很强大的数据处理能力,所以一般大型数据分析都需要用到numpy这个库,等会带大家认识一下几个常用的功能。
LinearRegression是线性回归模型对象,后面用它做数据拟合只需要把x,y数组传进去,就可以自动生成一个线性回归的模型。(简单易学)
# 定义输入特征矩阵X,四个样本,每个样本两个特征
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
np.array就是将当前数组转化为numpy数组形式,这样就可以运用np里面的一些功能了,这里生成了四个样本数据,每个数据有两个特征,因为数组是4 * 2
# 生成目标变量y,遵循预先设定的线性关系(dot用于计算点积)
#y1 = np.dot(X, np.array([1, 2])) + 3 # 线性方程为 y = x1 * 1 + x2 * 2 + 3
# 此时y是按照x的线性方程构造的,所以最后拟合得分为1
y2 = np.array([3,5,12,16]) # 构造一个非线性结果
这里对于y值,举例了两个不同的结果,第一种:np.dot()用于计算点积,对于上述例子线性方程的结果就是上述所示 ,此处就是建立一个标准的线性方程,用于对比下述结果。第二种:随机举出的几个例子,此时跟x的关系不满足标准线性方程。
# 创建并拟合线性回归模型(fit:基于当前模型,对xy进行训练)
# reg = LinearRegression().fit(X, y1)
reg = LinearRegression().fit(X,y2)
这里只需要把x,y数组传入LinearRegression中,就可以对现有数据进行建模,得到以一个线性回归方程式,对于第一个y1,那么建立的肯定是标准的线性方程,所有点都可以落在图像中,线性方程就如上述所示。
对于第二个y2,最后生成的线性方程,有部分点没有落在图像中。
# 计算模型在训练数据上的得分
score_y = reg.score(X, y2)
# 获取模型的系数
coefficients = reg.coef_
x1 = coefficients[0]
# 获取模型的截距
intercept = reg.intercept_
# 预测新数据点的值
prediction = reg.predict(np.array([[3, 5]]))
这里直接调用内置函数求出模型的得分,范围在(0,1)之间,越靠近1模型拟合的效果越好。
第二个是求出模型的系数,最后返回的是1*2的数组,因为传入的数据有两个特征(4*2),所以最后求出两个特征对应的系数。x1 = coefficients[0] , x2 = coefficients[1]
截距就是当x1,x2等于零时候,y的取值,最后就是利用这个训练的模型对新的点[3,5]的预测结果
最后运行结果如下:
这个模型最后拟合得分为0.99,效果还是可以的,对于新样本的预测结果为28.5,大家也可以将数据该为自己的数据,跑一下这个模型,对于其他大型数据,大家可以调用panda库读取csv文件,然后对文件数据进行numpy处理,再用该模型进行预测,但对于比较复杂的数据,线性模型还是不够用的,后面会给大家更新其他更有用的模型,跟大家一起学习。
三、完整代码
import numpy as np
from sklearn.linear_model import LinearRegression # 用于执行线性回归
# 定义输入特征矩阵X,四个样本,每个样本两个特征
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
# 生成目标变量y,遵循预先设定的线性关系(dot用于计算点积)
#y1 = np.dot(X, np.array([1, 2])) + 3 # 线性方程为 y = x1 * 1 + x2 * 2 + 3
# 此时y是按照x的线性方程构造的,所以最后拟合得分为1
y2 = np.array([3,5,12,16]) # 构造一个非线性结果
# 创建并拟合线性回归模型(fit:基于当前模型,对xy进行训练)
# reg = LinearRegression().fit(X, y1)
reg = LinearRegression().fit(X,y2)
# 计算模型在训练数据上的得分
score_y = reg.score(X, y2)
# 获取模型的系数
coefficients = reg.coef_
x1 = coefficients[0]
# 获取模型的截距
intercept = reg.intercept_
# 预测新数据点的值
prediction = reg.predict(np.array([[3, 5]]))
# 输出结果
print("Score_y1:{}".format(score_y))
print(x1)
print("x1,x2系数:", coefficients)
print("截距:", intercept)
print("预测样本[3, 5]结果:", prediction)