全国大学生数学建模竞赛中,线性回归模型是一种常用的数据分析工具。以下是对线性回归模型的详细解读:
一、线性回归模型的基本概念
线性回归是一种用于建立因变量(通常表示为 )与一个或多个自变量(通常表示为 )之间线性关系的统计方法。在线性回归中,我们假设因变量与自变量之间的关系可以用以下线性方程表示:
其中, 是截距项, 是回归系数,表示自变量对因变量的影响程度, 是误差项,代表模型无法解释的部分。
二、线性回归模型的建立步骤
-
问题定义与数据收集:
- 明确问题的研究目的,确定因变量和自变量。
- 收集相关的数据,可以通过实验、调查、数据库等途径获取。
-
数据预处理:
- 数据清洗:检查数据中是否存在缺失值、异常值等,并进行适当的处理。
- 数据标准化:如果自变量的尺度差异较大,可以进行标准化处理,使得不同变量具有相似的尺度。
- 特征选择:根据问题的需求和数据的特点,选择对因变量有重要影响的自变量。
-
模型建立:
- 选择合适的线性回归模型,如简单线性回归(只有一个自变量)或多元线性回归(有多个自变量)。
- 使用训练数据来估计回归系数。常用的方法是最小二乘法,即通过最小化实际值与预测值之间的误差平方和来确定回归系数。
-
模型评估:
- 评估模型的拟合程度,可以使用决定系数()来衡量模型对数据的解释能力。 的取值范围在 0 到 1 之间,越接近 1 表示模型拟合越好。
- 检查模型的假设条件,如误差项的独立性、同方差性等。可以通过绘制残差图等方法进行检查。
- 进行模型的显著性检验,判断回归系数是否显著不为零。可以使用 t 检验或 F 检验等方法。
-
模型应用与预测:
- 如果模型通过了评估,可以将其应用于新的数据进行预测。
- 对预测结果进行分析和解释,为问题的决策提供支持。
三、线性回归模型的注意事项
-
线性假设:线性回归模型假设因变量与自变量之间是线性关系。如果实际数据不满足线性假设,可以考虑进行数据转换或使用非线性回归模型。
-
多重共线性:如果自变量之间存在高度的相关性,即多重共线性,可能会导致回归系数的不稳定和不准确。可以通过计算方差膨胀因子(VIF)等方法来检测多重共线性,并采取相应的处理措施,如删除相关变量、进行主成分分析等。
-
异常值和强影响点:异常值和强影响点可能会对模型的结果产生较大的影响。可以通过绘制残差图、库克距离等方法来检测异常值和强影响点,并进行适当的处理。
-
样本大小:线性回归模型需要足够的样本数据来估计回归系数和进行模型评估。一般来说,样本数量应该是自变量数量的若干倍。
-
模型解释:在解释线性回归模型的结果时,要注意回归系数的含义和单位。同时,要考虑模型的局限性和不确定性,不要过度解读模型的结果。
四、线性回归模型的应用案例
线性回归模型在各个领域都有广泛的应用,以下是一个简单的应用案例:
假设我们要研究学生的数学成绩与学习时间和参加辅导班次数之间的关系。我们收集了一组学生的数学成绩、学习时间和参加辅导班次数的数据,然后使用线性回归模型进行分析。
-
问题定义与数据收集:
- 因变量:学生的数学成绩。
- 自变量:学习时间和参加辅导班次数。
- 数据收集:通过问卷调查或学校记录等方式收集学生的数学成绩、学习时间和参加辅导班次数的数据。
-
数据预处理:
- 数据清洗:检查数据中是否存在缺失值和异常值,并进行处理。
- 数据标准化:对学习时间和参加辅导班次数进行标准化处理,使得它们具有相似的尺度。
-
模型建立:
- 选择多元线性回归模型。
- 使用最小二乘法估计回归系数。
-
模型评估:
- 计算决定系数 ,评估模型对数据的解释能力。
- 绘制残差图,检查模型的假设条件。
- 进行回归系数的显著性检验。
在线性回归中,主要有以下公式:
一、多元线性回归模型公式
其中:
二、最小二乘法估计回归系数公式
通过最小化实际值与预测值之间的误差平方和来确定回归系数。
误差平方和(SSE)公式为:,其中是样本数量,是实际值,是预测值。
对于多元线性回归,使用最小二乘法得到的回归系数估计值计算公式如下:
其中:
三、决定系数(R-squared)公式
其中:
- SSE是误差平方和,已在前面介绍。
- ,其中是因变量的均值。
的取值范围在 0 到 1 之间,越接近 1 表示模型拟合越好。
四、方差膨胀因子(VIF)公式
对于多元线性回归中的第个自变量,其方差膨胀因子,其中是将第个自变量作为因变量,其他自变量作为预测变量进行回归得到的决定系数。
如果的值较大(通常认为大于 10),则说明该自变量与其他自变量之间存在较强的多重共线性。
一、导入库和设置中文字体
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
这段代码导入了numpy
、sklearn
中的linear_model
模块、matplotlib.pyplot
和matplotlib
模块,并设置了中文字体为SimHei
,同时解决了负号显示问题。
二、简单线性回归示例
X_train = np.array([[88,11],
[87,11],
[88,12],
[89,12],
[87,13],
[89,13],
[88,14],
[90,14],
[90,15],
[91,16]])
y_train = np.array([5.382,5.299,5.358,5.292,5.602,6.014,5.830,6.102,6.075,6.414])
x_test = np.array([[88,11]])
reg = linear_model.LinearRegression()
reg.fit(X_train, y_train)
reg.predict(x_test)
Y = reg.predict(X_train)
x = np.linspace(5.2, 6.4, 100)
plt.plot(Y, y_train, 'ro', x, x, 'b--')
plt.xlabel("预测的因变量")
plt.ylabel("实际的因变量")
plt.legend(("预测值 X,实际值 y", "全部吻合的直线"))
plt.show()
print(reg.score(X_train,y_train))
这里创建了一个简单的二维特征数据集X_train
和对应的目标变量y_train
,然后使用线性回归模型进行训练和预测。绘制了预测值和实际值的散点图以及一条直线,最后打印出模型在训练集上的得分。
三、房价预测示例
housing = pd.read_csv('house-price.csv')
print(housing.head(10))
housing = housing.drop(['date','street','city','statezip','country'],axis=1)
print(housing)
# min_max_scaler = preprocessing.MinMaxScaler()
# housing_data = min_max_scaler.fit_transform(housing)
# print(housing_data)
Y = housing['price']
X = housing.drop(['price'],axis=1)
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=42)
reg = linear_model.LinearRegression()
reg.fit(X_train,y_train)
df1 = reg.predict(X_test)
print(df1)
print(reg.score(X_test,y_test))
print(reg.score(X_train,y_train))
Y = reg.predict(X_train)
x = X_train
plt.plot(Y,y_train,'ro',x,x,'b--')
plt.xlabel("预测的因变量")
plt.ylabel("实际的因变量")
plt.legend(("预测值 X,实际值 y", "全部吻合的直线"))
plt.show()
这段代码首先读取一个房价数据集,然后进行数据预处理,去除一些列。接着将数据集分为训练集和测试集,使用线性回归模型进行训练和预测,打印出预测结果和模型在测试集和训练集上的得分,并绘制了预测值和实际值的散点图。
完整代码:
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
#其它的字体有:FangSong/HeiTi/KaiTi
mpl.rcParams['axes.unicode_minus'] =False
#%%
X_train = np.array([[88,11],
[87,11],
[88,12],
[89,12],
[87,13],
[89,13],
[88,14],
[90,14],
[90,15],
[91,16]])
y_train = np.array([5.382,5.299,5.358,5.292,5.602,6.014,5.830,6.102,6.075,6.414])
x_test = np.array([[88,11]])
#%%
reg = linear_model.LinearRegression()
reg.fit(X_train, y_train)
reg.predict(x_test)
#%%
Y=reg.predict(X_train)
x=np.linspace(5.2,6.4,100)
plt.plot(Y,y_train,'ro',x,x,'b--')
plt.xlabel("预测的因变量")
plt.ylabel("实际的因变量")
plt.legend(("预测值X,实际值y","全部吻合的直线"))
plt.show()
#%%
print(reg.score(X_train,y_train))
#%%
from sklearn import preprocessing
from sklearn import linear_model
from sklearn import datasets
from sklearn.datasets import fetch_california_housing
import pandas as pd
#%%
housing = pd.read_csv('house-price.csv')
print(housing.head(10))
#%%
housing = housing.drop(['date','street','city','statezip','country'],axis=1)
print(housing)
#%%
# min_max_scaler = preprocessing.MinMaxScaler()
# housing_data = min_max_scaler.fit_transform(housing)
# print(housing_data)
#%%
Y = housing['price']
X = housing.drop(['price'],axis=1)
#%%
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=42)
#%%
reg = linear_model.LinearRegression()
reg.fit(X_train,y_train)
df1=reg.predict(X_test)
print(df1)
print(reg.score(X_test,y_test))
print(reg.score(X_train,y_train))
#%%
Y=reg.predict(X_train)
x=X_train
plt.plot(Y,y_train,'ro',x,x,'b--')
plt.xlabel("预测的因变量")
plt.ylabel("实际的因变量")
plt.legend(("预测值X,实际值y","全部吻合的直线"))
plt.show()
资源下载链接:
帮助文档(AI大模型、画图网站、算法分析).docx_画图网站资源-CSDN文库
pythonProject2.rar全国数学建模比赛参考代码资源-CSDN文库
比赛常用算法公式集合.docx全国数学建模比赛常用参考公式资源-CSDN文库
2023年C题.rar全国大学生数学建模比赛2023年c题代码_2023年数学建模c题MATLAB资源-CSDN文库