AnyMath 文档
Notebook

</no-translation>

<no-translation># </no-translation>多元线性回归:预测汽车油耗

<no-translation>

</no-translation>

本例演示了使用最小二乘法基于功率和质量预测汽车燃料消耗的多元线性回归模型的构建。 源数据取自mtcars数据集。

<no-translation>

</no-translation>

多元线性回归的基本公式:

<no-translation>$$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \varepsilon,

</no-translation>

Mtcars数据集是一个关于32辆1973-74汽车特征的经典数据集,由Motor Trend杂志编制。 数据集包含有关油耗、发动机功率、重量、气缸数和其他车辆规格的信息。

该数据集广泛用于统计学,计量经济学和机器学习的学术课程,作为演示回归分析的标准示例。

<no-translation>

</no-translation>

<no-translation>## </no-translation>安装和运行必要的库:

<no-translation>

In [ ]:
Pkg.add(["RDatasets", "Statistics", "DataFrames"])
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using RDatasets        # 下载资料
using Plots            # 可视化
using Statistics       # 统计功能
using DataFrames       # 使用表格

</no-translation>

<no-translation>## </no-translation>加载和转换数据:

<no-translation>

In [ ]:
cars = dataset("datasets", "mtcars")  # 加载嵌入的数据集

# 选择预测变量和目标变量
cars[:, "weight_tons"] = cars[:, "WT"] .* 0.453592  # 重量:从数千磅到吨
X_raw = cars[:, ["HP", "weight_tons"]]   # 功率(马力)和重量(吨)
cars[:, "fuel_l100km"] = 235.22 ./ cars[:, "MPG"]  # 消费:从英里/加仑到L/100公里
y = cars[:, "fuel_l100km"]               # 燃料消费料量(l/100km)

# 为了清楚起见,让我们转换列名称
rename!(X_raw, [:HP, :weight_tons])
Out[0]:
32×2 DataFrame
7 rows omitted
RowHPweight_tons
Int64Float64
11101.18841
21101.30408
3931.05233
41101.4583
51751.56036
61051.56943
72451.61932
8621.44696
9951.42881
101231.56036
111231.56036
121801.84612
131801.6919
⋮⋮⋮
21971.1181
221501.59664
231501.55809
242451.74179
251751.74406
26660.877701
27910.970687
281130.686285
292641.43789
301751.25645
313351.61932
321091.26099

</no-translation>

下载经典的mtcars数据集并将美国计量单位转换为公制单位以获得更好的理解。 重量从数千磅转换为吨(乘以0.453592),燃料消耗从每加仑英里转换为每100公里升。 我们选择功率和重量作为预测燃料消耗的预测因子。

<no-translation>

</no-translation>

<no-translation>## </no-translation>矩阵的归一化和准备:

<no-translation>

In [ ]:
normalize(x) = (x .- mean(x)) ./ std(x)
X = hcat(ones(nrow(X_raw)), normalize(X_raw.HP), normalize(X_raw.weight_tons))

y = float(y)  # 转换为实数
Out[0]:
32-element Vector{Float64}:
 11.200952380952382
 11.200952380952382
 10.316666666666666
 10.99158878504673
 12.578609625668449
 12.995580110497237
 16.44895104895105
  9.64016393442623
 10.316666666666666
 12.251041666666667
 13.214606741573034
 14.34268292682927
 13.596531791907514
  ⋮
 10.94046511627907
 15.175483870967742
 15.475000000000001
 17.685714285714283
 12.251041666666667
  8.616117216117216
  9.046923076923077
  7.737500000000001
 14.887341772151897
 11.94010152284264
 15.681333333333333
 10.99158878504673

</no-translation>

我们将z分数归一化应用于预测变量,将它们减少到标准形式(均值=0,标准差=1)。 这提高了算法的数值稳定性,并使系数彼此相当。 我们通过为自由回归项添加一列单位来形成矩阵X。

<no-translation>

</no-translation>

<no-translation>## </no-translation>最小二乘解:

<no-translation>

In [ ]:
# MNC实施(分析解决方案)
β = inv(X'X) * X'y  # (XᵀX)⁻¹Xᵀy
Out[0]:
3-element Vector{Float64}:
 12.755331278523013
  1.2062112633104227
  2.643362422121514

</no-translation>

我们使用经典的OLS公式来获得最优回归系数。 该公式最大限度地减少了残差的平方和,并为线性回归提供了唯一的解析解。 结果β包含三个系数:自由项、功率系数和质量系数。

<no-translation>

</no-translation>

<no-translation>## </no-translation>模型质量的预测和评估:

<no-translation>

In [ ]:
y_pred = X * β
residuals = y - y_pred

# 质量指标
mse = mean(residuals.^2)
rmse = sqrt(mse)
r2 = 1 - sum(residuals.^2) / sum((y .- mean(y)).^2);

</no-translation>

我们计算预测的燃料消耗值,并找到实际值和预测值之间的差异。 我们计算关键质量指标:均方根误差(MSE),用于估计初始单位精度的根(RMSE),以及用于估计解释方差的判定系数(R2)。

<no-translation>

</no-translation>

<no-translation>## </no-translation>多维回归的可视化:

<no-translation>

In [ ]:
# 两个标志的3d可视化
p1 = plot(title="多维回归", legend=:none, size=(800, 600))
scatter!(X_raw.HP, X_raw.weight_tons, y, marker=:circle, color=:blue, 
         xlabel="功率(马力)", ylabel="重量(吨)", zlabel="Расход (л/100км)")
surface!(sort(unique(X_raw.HP)), sort(unique(X_raw.weight_tons)), 
         (x,y) -> β[1] + β[2]*(x - mean(X_raw.HP))/std(X_raw.HP) + β[3]*(y - mean(X_raw.weight_tons))/std(X_raw.weight_tons),
         alpha=0.5)

display(p1)

</no-translation>

三维图形显示了这两个变量对燃料消耗的影响。 蓝色圆点代表实际观测值,而半透明表面代表回归模型的预测值。

<no-translation>

In [ ]:
# 结果输出
println("\nРезультаты регрессионного анализа:")
println("==================================================")
println("模型的系数:")
println(" -常数(b0): ", round(β[1], digits=4), " л/100км")
println(" -功率(b1): ", round(β[2], digits=4), " л/100км на 1 std мощности")
println(" -质量(b2):      ", round(β[3], digits=4), " л/100км на 1 std веса")
println("\nМетрики качества:")
println(" - MSE:  ", round(mse, digits=4), " (л/100км)²")
# @markdown回归分析结果:
println(" - RMSE: ", round(rmse, digits=4), " л/100км")
println(" - R²:   ", round(r2, digits=4))
println("==================================================")

# 系数的解释
hp_std = std(X_raw.HP)
weight_std = std(X_raw.weight_tons)

println("\nИнтерпретация:")
println("- При увеличении мощности на 1 стандартное отклонение (≈$(round(hp_std, digits=1)) л.с.),")
println("  燃料消耗变化至 ", round(β[2], digits=2), " л/100км")
println("- При увеличении массы на 1 стандартное отклонение (≈$(round(weight_std, digits=2)) тонны),")
println("  燃料消耗变化至 ", round(β[3], digits=2), " л/100км")
println("- Intercept (", round(β[1], digits=1), " л/100км) - средний расход при средних мощности и массе")
Результаты регрессионного анализа:
==================================================
Коэффициенты модели:
 - Константа (b0): 12.7553 л/100км
 - Мощность (b1): 1.2062 л/100км на 1 std мощности
 - Масса (b2):      2.6434 л/100км на 1 std веса

Метрики качества:
 - MSE:  2.2109 (л/100км)²
 - RMSE: 1.4869 л/100км
 - R²:   0.8471
==================================================

Интерпретация:
- При увеличении мощности на 1 стандартное отклонение (≈68.6 л.с.),
  расход топлива изменяется на 1.21 л/100км
- При увеличении массы на 1 стандартное отклонение (≈0.44 тонны),
  расход топлива изменяется на 2.64 л/100км
- Intercept (12.8 л/100км) - средний расход при средних мощности и массе

</no-translation>

<no-translation>## </no-translation>结论:

<no-translation>

</no-translation>

在这个例子中,我们考虑了使用最小二乘法来构建基于经典mtcars数据集的多元线性回归模型,该数据集包含1973-74年制造的32辆汽车的特征。

因变量为汽车油耗(l/100km),归一化发动机功率和车辆重量为自变量。