##以下的内容为司守奎老师的《python数学建模》的学习笔记

一.多元线性回归分析:

  1.基本思想:多元回归分析是一种统计方法,用于研究一个因变量(目标变量)与多个自变量(预测变量)之间的定量关系。它的核心是通过数据拟合出一个线性方程,描述这些变量之间的关系,并用于预测或控制。

  其中它的步骤为:1.参数估计:利用最小二乘法计算回归系数b0....bm。2.进行统计检验,其中F检验为判断每个自变量对于因变量是否有影响,t检验为判断单个自变量对于因变量是否有影响。3.进行预测和应用。

  其中数学公式如下所示:

                                  

##以下为特别的注意事项:

​​​​​​​​​​​​​

线性假设:回归模型假设自变量与因变量是线性关系。若实际关系为非线性(如房价与面积呈对数关系),需转换变量。

多重共线性:如果自变量之间高度相关(如“面积”和“卧室数量”),会导致系数估计不稳定。可通过方差膨胀因子(VIF)检测。

误差项:误差需满足独立、正态分布、方差齐性,否则需改进模型(如使用稳健回归)。

     以下,我们通过一个例题去理解内容,具体例题如下:研究水泥凝固时放出的热量 yy 与两种主要化学成分 x1x1​ 和 x2x2​ 的关系,基于实测数据建立线性回归模型:y=a0+a1x1+a2x2。

序号x1x2y序号x1x2y
172678.5813172.5
212974.3925493.1
31156104.3102147115.9
4113187.61114083.8
575295.9121166113.3
61155109.2131068109.4
7371102.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)。研究目标是建立家庭年收入与实际购房概率之间的关系,分析收入对购房决策的影响。

序号家庭年收入 签订意向书人数 实际购房人数 实际购房比例 逻辑变换 
11.52580.32-0.7538
22.532130.4063-0.3795
33.558260.4483-0.2076
44.552220.4231-0.3102
55.543200.4651-0.1398
66.539220.56410.2578
77.528160.57140.2877
88.521120.57140.2877
99.515100.66670.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),表明模型高度显著。

#以上便为所有内容

Logo

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

更多推荐