2026b

# 计算曲线拟合


此示例说明如何处理曲线拟合。

# 加载数据并拟合多项式曲线

using TyPlot
using TyCurveFitting
include(pkgdir(TyCurveFitting) * "/examples/docs/census.jl")
curvefit = fit("poly3", cdate, pop, normalize=true)
线性模型 poly3:
  y(p1,p2,p3,p4,x) = p1*x^3 + p2*x^2 + p3*x + p4

  其中 x 按均值 1890.0 和标准差 62.048368229954285 进行归一化

系数(置信边界为 95%):
  p1 = 0.9210230707512524 (-0.9742951110333656, 2.8163412525358704)
  p2 = 25.18335240274599 (23.573630442901226, 26.79307436259075)
  p3 = 73.85978132809592 (70.33080589790944, 77.3887567582824)
  p4 = 61.74442628309906 (59.69071774080498, 63.79813482539314)

输出显示拟合系数和拟合系数的置信区间。

# 绘制拟合、数据、残差和预测区间

plotfit(curvefit, cdate, pop)

绘制拟合残差。

plotfit(curvefit, cdate, pop, "residuals")

绘制拟合预测区间。

plotfit(curvefit, cdate, pop, "predfunc")

# 在指定点计算拟合

通过指定 x 的值来计算特定点的拟合,使用以下形式:y = fitmodel(x)。 y = fittedmodel(x)。

curvefit(1991)
ans = 252.66898611845818

# 计算多点的拟合值

在值向量处评估模型以外推到 2050 年。

xi = 2000:10:2050
curvefit(xi)
ans = 6-element Vector{Float64}:

 276.9631578947368
 305.44196855775795
 335.50660049332816
 367.1801866325893
 400.4858599066836
 435.446753246753

获取这些值的预测区间。

ci, = predint(curvefit, xi)
ci = 6×2 Matrix{Float64}:

 267.859  286.067
 294.307  316.577
 321.592  349.421
 349.727  384.633
 378.726  422.246
 408.592  462.302

在外推的拟合范围内绘制拟合和预测区间。默认情况下,拟合是在数据范围内绘制的。要查看从拟合推断的值,请在绘制拟合之前将轴的 x 上限设置为 2050。要绘制预测区间,请使用 “predobs” 或 “predfun” 作为绘图类型。

h = plot(cdate, pop, "o")
h[1].set_label("_")
xlim([1900, 2050])
hold("on")
plotfit(curvefit, "predobs")
hold("off")

# 获取模型方程

为了得到模型方程,使用 formula。

formula(curvefit)
ans = "p1*x^3 + p2*x^2 + p3*x + p4"

# 获取系数名称和值

按顺序指定系数。

p1 = curvefit.params[1]
p1 = 0.9210230707512524
p2 = curvefit.params[2]
p2 = 25.18335240274599

获取所有系数名称。查看拟合方程(例如 f(x) = p1*x^3+... )以查看每个系数的模型项。

coeffnames(curvefit)
ans = 4-element Vector{String}:

 "p1"
 "p2"
 "p3"
 "p4"
coeffvalues(curvefit)
ans = 4-element Vector{Float64}:

 0.9210230707512524
 25.18335240274599
 73.85978132809592
 61.74442628309906

# 获得系数的信赖区间

使用系数的信赖区间来帮助您评估和比较拟合。系数的信赖区间决定了它们的准确性。相距甚远的区间表示不确定性。如果线性系数的边界包含零,这意味着您无法确定这些系数是否不同于零。如果某些模型项的系数为零,则它们对拟合没有帮助。

confint(curvefit)[1]
ans = 2×4 Matrix{Float64}:

 -0.974295  23.5736  70.3308  59.6907
  2.81634   26.7931  77.3888  63.7981

# 检查拟合优度统计

要在命令行获取拟合优度统计信息,您可以从拟合结果的 s_data 域元中得到。

gof = curvefit.s_data
R方: 0.9987879121941519
SSE: 149.76872418199667
DFE: 17.0
调整R方: 0.998574014346061
RMSE: 2.9681517737275764

计算残差直方图,这是对正态分布的近似。

res = pop - fvallm(curvefit, cdate)
histogram(res, 10)

# 绘制拟合、数据和残差

h = plotfit(curvefit, cdate, pop, "fit", "residuals")