《多元线性回归分析和Logistic回归分析》
##以下的内容为司守奎老师的《python数学建模》的学习笔记
一.多元线性回归分析:
1.基本思想:多元回归分析是一种统计方法,用于研究一个因变量(目标变量)与多个自变量(预测变量)之间的定量关系。它的核心是通过数据拟合出一个线性方程,描述这些变量之间的关系,并用于预测或控制。
其中它的步骤为:1.参数估计:利用最小二乘法计算回归系数b0....bm。2.进行统计检验,其中F检验为判断每个自变量对于因变量是否有影响,t检验为判断单个自变量对于因变量是否有影响。3.进行预测和应用。
其中数学公式如下所示:

##以下为特别的注意事项:
线性假设:回归模型假设自变量与因变量是线性关系。若实际关系为非线性(如房价与面积呈对数关系),需转换变量。
多重共线性:如果自变量之间高度相关(如“面积”和“卧室数量”),会导致系数估计不稳定。可通过方差膨胀因子(VIF)检测。
误差项:误差需满足独立、正态分布、方差齐性,否则需改进模型(如使用稳健回归)。
以下,我们通过一个例题去理解内容,具体例题如下:研究水泥凝固时放出的热量 yy 与两种主要化学成分 x1x1 和 x2x2 的关系,基于实测数据建立线性回归模型:y=a0+a1x1+a2x2。
| 序号 | x1 | x2 | y | 序号 | x1 | x2 | y |
|---|---|---|---|---|---|---|---|
| 1 | 7 | 26 | 78.5 | 8 | 1 | 31 | 72.5 |
| 2 | 1 | 29 | 74.3 | 9 | 2 | 54 | 93.1 |
| 3 | 11 | 56 | 104.3 | 10 | 21 | 47 | 115.9 |
| 4 | 11 | 31 | 87.6 | 11 | 1 | 40 | 83.8 |
| 5 | 7 | 52 | 95.9 | 12 | 11 | 66 | 113.3 |
| 6 | 11 | 55 | 109.2 | 13 | 10 | 68 | 109.4 |
| 7 | 3 | 71 | 102.7 |
在这里我们贴出详细的代码:
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
# 从Excel文件读取数据(替换原来的txt文件读取)
data = pd.read_excel("多元回归分析数据.xlsx") # 读取xlsx文件
a = data.values # 转换为numpy数组
# 构建并拟合模型(保持原有分析逻辑)
md = LinearRegression().fit(a[:, :2], a[:, 2]) # 使用前两列作为特征,最后一列作为目标
y = md.predict(a[:, :2]) # 求预测值
# 获取回归系数和评估指标
b0 = md.intercept_ # 截距项
b12 = md.coef_ # 回归系数
R2 = md.score(a[:, :2], a[:, 2]) # 计算R²
# 输出结果(格式化输出)
print("回归系数:")
print(f"b0(截距) = {b0:.4f}")
print(f"b1(x1系数) = {b12[0]:.4f}")
print(f"b2(x2系数) = {b12[1]:.4f}")
print(f"\n拟合优度 R² = {R2:.4f}")
# 可选:输出预测值与实际值的对比
print("\n预测值与实际值对比:")
for i in range(len(a)):
print(f"样本{i+1}: 实际值={a[i,2]:.1f}, 预测值={y[i]:.1f}, 残差={a[i,2]-y[i]:.1f}")
求出的结果如下所示:
回归系数:
b0(截距) = 53.4852
b1(x1系数) = 1.4761
b2(x2系数) = 0.6456
拟合优度 R² = 0.9773
预测值与实际值对比:
样本1: 实际值=74.3, 预测值=73.7, 残差=0.6
样本2: 实际值=104.3, 预测值=105.9, 残差=-1.6
样本3: 实际值=87.6, 预测值=89.7, 残差=-2.1
样本4: 实际值=95.9, 预测值=97.4, 残差=-1.5
样本5: 实际值=109.2, 预测值=105.2, 残差=4.0
样本6: 实际值=102.7, 预测值=103.7, 残差=-1.0
样本7: 实际值=72.5, 预测值=75.0, 残差=-2.5
样本8: 实际值=93.1, 预测值=91.3, 残差=1.8
样本9: 实际值=115.9, 预测值=114.8, 残差=1.1
样本10: 实际值=83.8, 预测值=80.8, 残差=3.0
样本11: 实际值=113.3, 预测值=112.3, 残差=1.0
样本12: 实际值=109.4, 预测值=112.1, 残差=-2.7
二.Logistic回归:
1.基本思想:Logistic回归是一种用于分类问题的统计方法(尤其是二分类,如判断"是/否")。它与普通线性回归不同,不是预测具体数值,而是预测某个类别的概率。在这里输出的不是为一个具体的实数数值,而是为一个因变量为1或者0的概率值。
#值得注意的是,它无法使用通常的最小二乘法来进行参数的估计。而是通过最大似然估计来确定参数,随后利用梯度下降的方法来求解。
2.实际问题:
在一次房屋销售会上,共有325名顾客与房地产商签订了初步购房意向书。随后3个月内,部分顾客实际购买了房屋(记为1),其余未购买(记为0)。研究目标是建立家庭年收入与实际购房概率之间的关系,分析收入对购房决策的影响。
| 序号 | 家庭年收入 | 签订意向书人数 | 实际购房人数 | 实际购房比例 | 逻辑变换 |
|---|---|---|---|---|---|
| 1 | 1.5 | 25 | 8 | 0.32 | -0.7538 |
| 2 | 2.5 | 32 | 13 | 0.4063 | -0.3795 |
| 3 | 3.5 | 58 | 26 | 0.4483 | -0.2076 |
| 4 | 4.5 | 52 | 22 | 0.4231 | -0.3102 |
| 5 | 5.5 | 43 | 20 | 0.4651 | -0.1398 |
| 6 | 6.5 | 39 | 22 | 0.5641 | 0.2578 |
| 7 | 7.5 | 28 | 16 | 0.5714 | 0.2877 |
| 8 | 8.5 | 21 | 12 | 0.5714 | 0.2877 |
| 9 | 9.5 | 15 | 10 | 0.6667 | 0.6931 |
在这里我们贴上代码,并加上注释
import numpy as np
import pandas as pd
import statsmodels.api as sm
# 1. 从Excel文件读取数据
data = pd.read_excel("Logic回归分析数据.xlsx", header=None,
names=['序号', '家庭年收入x(万元)', '签订意向书人数n_i',
'实际购房人数m_i', '实际购房比例p_i', '逻辑变换y_i*'])
# 提取所需列数据
x = data['家庭年收入x(万元)'].values
n_i = data['签订意向书人数n_i'].values
m_i = data['实际购房人数m_i'].values
yi = data['逻辑变换y_i*'].values # 直接使用已有的逻辑变换值
# 2. 计算购房比例(验证计算)
pi = m_i / n_i # 验证计算购房比例
print("验证购房比例计算:")
for i in range(len(pi)):
print(f"第{i+1}组: 计算值={pi[i]:.4f}, 表格值={data['实际购房比例p_i'][i]:.4f}")
# 3. 构建并拟合模型(添加截距项)
X = sm.add_constant(x) # 添加常数列[1,1,...,1]
model = sm.OLS(yi, X).fit() # 普通最小二乘回归
# 4. 输出模型摘要
print("\n回归模型摘要:")
print(model.summary()) # 打印回归结果(系数、R²、p值等)
# 5. 提取回归系数
b = model.params # 获取截距(b0)和斜率(b1)
print("\n回归系数:")
print(f"截距 b0 = {b[0]:.4f}")
print(f"收入系数 b1 = {b[1]:.4f}")
# 6. 预测年收入9万元时的购房概率
p0 = 1 / (1 + np.exp(-np.dot(b, [1, 9]))) # P = 1/(1+e^-(b0 + b1*9))
print(f"\n年收入9万元时的预测购房概率:{p0:.4f}")
# 7. 将结果保存到新Excel文件
result_df = pd.DataFrame({
'变量': ['截距b0', '收入系数b1', '年收入9万元预测概率'],
'值': [b[0], b[1], p0],
'说明': ['模型常数项', '收入每增加1万元的logit变化', '预测概率值']
})
# 添加模型评估指标
metrics_df = pd.DataFrame({
'指标': ['R-squared', 'Adj. R-squared', 'F-statistic', 'Prob (F-statistic)'],
'值': [model.rsquared, model.rsquared_adj, model.fvalue, model.f_pvalue]
})
# 使用ExcelWriter保存多个sheet
with pd.ExcelWriter("回归分析结果.xlsx") as writer:
result_df.to_excel(writer, sheet_name='回归系数', index=False)
metrics_df.to_excel(writer, sheet_name='模型评估', index=False)
data.to_excel(writer, sheet_name='原始数据', index=False)
print("\n分析结果已保存到『回归分析结果.xlsx』")
print("包含三个工作表: 回归系数、模型评估、原始数据")
在这里我们得到了以下的excle数据表格:


R-squared=0.924252518801571
本例中,家庭年收入能解释92.4%的购房决策变化,剩余7.6%可能由其他因素(如贷款利率、房屋位置等)影响。
Adj. R-squared=0.913431450058938
含义:调整后的R²,考虑了自变量数量(防止过拟合)。与R²的差异:当加入不显著的自变量时,Adj. R²会明显低于R²。本例两者接近,说明模型简洁有效。
F-statistic=85.4123137726876
Prob (F-statistic)=0.0000358871562847618
本例F=85.41,对应p=3.59e-05(远小于0.05),表明模型高度显著。

#以上便为所有内容
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)