2026a

# 多项式模型

# 关于多项式模型


曲线的多项式模型由

给出,其中 是多项式的阶, 是多项式的次数,。阶数给出要拟合的系数数量,次数给出预测变量的最高幂。

在本指南中,多项式以次数来描述。例如,三次(cubic)多项式由以下公式给出

当需要一个简单的经验模型时,通常会使用多项式。您可以使用多项式模型进行插值或外推,或使用全局拟合来表征数据。例如,0 至 温度范围内的 J 型热电偶的温度到电压转换由七次多项式描述。

提示

如果您不需要全局参数拟合,并且希望最大限度地提高拟合的灵活性,分段多项式可能是最佳方法。有关更多信息,请参见非参数拟合

多项式拟合的主要优点包括对不太复杂的数据具有合理的灵活性,并且它们是线性的,这意味着拟合过程很简单。主要缺点是高阶拟合可能变得不稳定。此外,任何阶的多项式都可以在数据范围内提供良好的拟合,但在该范围之外可能会出现很大偏差。因此,在使用多项式进行外推时要小心谨慎。

当您使用高阶多项式进行拟合时,拟合过程使用预测值作为具有非常大值的矩阵的基础,这可能会导致缩放问题。为了解决这个问题,您应该通过将数据以零均值为中心并将其缩放到单位标准差来对其进行规范化。通过选中曲线拟合器应用中的 “中心化并缩放” 复选框来规范数据。

# 以交互方式拟合多项式模型

  1. 在 Syslab 命令行中输入 curveFitter(),打开 Curve Fitter 应用程序。或者,在 APP 选项卡中,单击曲线拟合器
  2. 在曲线拟合器中,选择曲线或曲面数据。在曲线拟合器选项卡的数据部分,单击选择数据。在对话框中选择数据变量。

    • 如果您选择曲线数据(X 数据Y 数据,或仅选择 Y 数据与索引),则曲线拟合器会创建默认曲线拟合,即多项式拟合;

    • 如果您选择曲面数据(X 数据Y 数据Z 数据),则曲线拟合器会创建默认曲面拟合,即插值拟合。单击拟合类型部分中的箭头以打开图库,然后单击回归模型组中的多项式

对于曲线数据,应用程序会为 X 创建多项式拟合。

对于曲面数据,该应用程序为 X 和 Y 创建多项式拟合。

您可以在 “拟合选项” 窗格中指定以下选项:

  • X 和 Y 变量的次数:

    • 对于曲线数据,X 的度数最高可达 8;

    • 对于曲面数据,X 和 Y 的度数最高可达 4。多项式拟合的度数是 X 和 Y 度数的最大值。

  • 要使用的稳健线性最小二乘拟合方法(Off、LAR 或 Bisquare)。有关详细信息,请参见 fitoptions 函数的 robust 关键字参数。

  • 设置边界或排除项。您可以通过将任何项的边界设置为 0 来排除它。查看拟合结果窗格以查看模型项、系数值和拟合优度统计信息。

提示

如果您的数据变量具有非常不同的比例,请选中并清除 "中心化并缩放" 复选框以查看拟合的差异。当缩放数据可以改善拟合时,应用程序会在 "拟合结果" 窗格中显示消息。

有关比较各种多项式拟合的示例,请参见曲线拟合器应用中的比较拟合。

# 使用拟合函数拟合多项式

此示例显示如何使用拟合函数将多项式拟合到数据。步骤包括拟合和绘制多项式曲线和曲面、指定拟合选项、返回拟合优度统计、计算预测并显示置信区间。

多项式库模型是 fit 和 fittype 函数的输入参数。指定模型类型 poly,后跟 x(最多 8 个)或 x 和 y(最多 4 个)的度数。例如,您可以使用 "poly2" 指定二次曲线,或使用 "poly33" 指定三次曲面。

创建并绘制二次多项式曲线

加载一些数据并拟合二次多项式。使用字符串 "poly2" 指定二次或二次多项式。

using TyCurveFitting
using TyPlot
include(pkgdir(TyCurveFitting) * "/examples/docs/census.jl")
fitpoly2 = fit("poly2",cdate,pop)
# Plot the fit with the plot method.
plotfit(fitpoly2,cdate,pop);
# Move the legend to the top left corner.
legend(loc="northwest");
fitpoly2 = 
    线性模型 poly2:
      y(p1,p2,p3,x) = p1*x^2 + p2*x + p3

    系数(置信边界为 95%):
      p1 = 0.006541130494221316 (0.006124192176934138, 0.006958068811508494)
      p2 = -23.509745995429345 (-25.08593349854094, -21.93355849231775)
      p3 = 21129.592119236608 (19641.16706062495, 22618.017177848265)

创建三次曲线

拟合三次多项式 "poly3"。

fitpoly3 = fit("poly3",cdate,pop)
plotfit(fitpoly3,cdate,pop);
fitpoly3 = 
    ┌ Warning: 方程为病态。请删除重复的数据点或尝试中心化并缩放。

    线性模型 poly3:
      y(p1,p2,p3,p4,x) = p1*x^3 + p2*x^2 + p3*x + p4

    系数(置信边界为 95%):
      p1 = 3.855488523646642e-6 (-4.080231349038952e-6, 1.1791208396332235e-5)
      p2 = -0.015319489434858492 (-0.06031697993227102, 0.029678001062554037)
      p3 = 17.78145655605228 (-67.22264172669502, 102.78555483879957)
      p4 = -4851.900403949049 (-58350.27714562626, 48646.47633772817)

指定拟合选项

三次拟合警告方程条件不好,因此您应该尝试通过指定 "中心化并缩放" 选项进行中心化和缩放以及稳健拟合选项拟合三次多项式。

fit3 = fit("poly3", cdate, pop, normalize=true,robust="on")
plotfit(fit3,cdate,pop)
fit3 = 
    线性模型 poly3:
      y(p1,p2,p3,p4,x) = p1*x^3 + p2*x^2 + p3*x + p4

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

    系数(置信边界为 95%):
      p1 = -0.46194243339093627 (-1.894579330169367, 0.9706944633874943)
      p2 = 25.00525662186835 (23.788496758757855, 26.222016484978848)
      p3 = 77.03319815985186 (74.36570915228016, 79.70068716742357)
      p4 = 62.81475087751571 (61.262389564837775, 64.36711219019365)

要了解可以为库模型 "poly3" 设置哪些参数,请使用 fitoptions 函数。

fitoptions("poly3")
TyCurveFitting.LLSQOptions(false, Int64[], Float64[], "LinearLeastSquares", "mldivide", "off", Float64[], Float64[])

获取拟合优度统计数据

指定 "gof" 输出参数以获取三次多项式拟合的拟合优度统计数据。

fit4 = fit("poly3", cdate, pop,normalize=true);
gof = fit4.s_data
gof = 
    sse: 149.76872418199667
    rsquare: 0.9987879121941519
    dfe: 17.0
    adjrsquare: 0.998574014346061
    rmse: 2.9681517737275764

绘制残差图以评估拟合度

要绘制残差图,请在绘图方法中指定 "残差" 作为绘图类型。

plotfit(fit4,cdate, pop,"residuals");

检查超出数据范围的拟合

默认情况下,拟合是在数据范围内绘制的。要在不同范围内绘制拟合,请在绘制拟合之前设置轴的 x 限值。例如,要查看从拟合中推断出的值,请将 x 上限设置为 2050。

plot(cdate, pop, "o");
xlim([1900, 2050]);
hold("on")
plotfit(fit4);
hold("off")

绘制预测边界

要绘制预测边界,请使用 "predobs" 或 "predfun" 作为绘图类型。

plotfit(fit4,cdate,pop,"predobs")

绘制截至 2050 年的三次多项式的预测界限。

plot(cdate, pop, "o");
xlim([1900, 2050])
hold("on")
plotfit(fit4, "predobs");
hold("off")

获取新查询点的置信区间

评估一些新查询点的拟合度。

cdateFuture = 2000:10:2020;
popFuture = fit4(cdateFuture)
popFuture = 3-element Vector{Float64}:
 276.9631578947368
 305.44196855775795
 335.50660049332816

使用 predint 方法计算未来人口预测的 95% 置信区间。

ci, = predint(fit4, cdateFuture, level=0.95, intv="observation")
ci = 3×2 Matrix{Float64}:
 262.103  291.823
 287.267  323.617
 312.796  358.217

绘制预测未来人口及其置信区间,并与拟合度和数据进行比较。

plot(cdate, pop, "o");
xlim([1900, 2040])
hold("on")
plotfit(fit4)
h = errorbar(cdateFuture,popFuture,popFuture-ci[:,1],ci[:,2]-popFuture);
hold("off")
legend(["cdate v pop","poly3","prediction"],loc="northwest")

拟合并绘制多项式曲面

加载一些曲面数据并拟合 x 和 y 的四次多项式。

include(pkgdir(TyCurveFitting) * "/examples/docs/franke.jl")
fitsurface=fit("poly44", [x y], z, normalize=true)
plot3fit(fitsurface, [x y], z)
fitsurface = 
    线性模型 poly[4,4]:
      z(p00,p10,p01,p20,p11,p02,p30,p21,p12,p03,p40,p31,p22,p13,p04,x,y) = p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2 + p30*x^3 + p21*x^2*y + p12*x*y^2 + p03*y^3 + p40*x^4 + p31*x^3*y + p22*x^2*y^2 + p13*x*y^3 + p04*y^4

      其中 x 按均值 1982.3418835324233 和标准差 868.6364864757421 进行归一化
      其中 x 按均值 0.49716054064429743 和标准差 0.2897456898580836 进行归一化

    系数(置信边界为 95%):
      p00 = 0.3471102625971777 (0.30329410823290154, 0.39092641696145386)
      p10 = -0.15024845640561735 (-0.19352984450250535, -0.10696706830872935)
      p01 = -0.4203323742124234 (-0.4636788824220026, -0.3769858660028442)
      p20 = 0.21649032721423456 (0.15143942949228417, 0.28154122493618494)
      p11 = 0.171730143897983 (0.11751114912838467, 0.22594913866758132)
      p02 = 0.03188941899720184 (-0.033511892030830825, 0.0972907300252345)
      p30 = 0.02777553059185766 (0.007489505827279697, 0.04806155535643562)
      p21 = 0.015011588979754107 (-0.0028065143038983574, 0.03282969226340657)
      p12 = -0.03658866645121105 (-0.0543896060280627, -0.018787726874359395)
      p03 = 0.11841922793027038 (0.09812067186053687, 0.1387177840000039)
      p40 = -0.07661258076812306 (-0.09984413669826307, -0.05338102483798306)
      p31 = -0.024873852386591462 (-0.04512329685977067, -0.004624407913412253)
      p22 = 0.0007463664126426333 (-0.0194830609313913, 0.020975793756676568)
      p13 = -0.029619765065633775 (-0.04987328170851055, -0.009366248422757007)
      p04 = -0.023991156608496215 (-0.04740262144118229, -0.0005796917758101351)

多项式模型拟合选项

所有拟合方法都具有默认属性 normalize、exclude、weights 和 method。有关示例,请参见在命令行中指定拟合选项

多项式模型具有 method 属性值 "Linear Least Squares",以及下表中显示的其他拟合选项属性。有关所有拟合选项的详细信息,请参见 fitoptions 参考页面。

属性 说明
robust 指定要使用的稳健线性最小二乘拟合方法。值为 "on"、"off"、"LAR" 或 "Bisquare"。默认值为 "off"。
"LAR" 指定最小绝对残差法,"Bisquare" 指定双平方权重法。
lb 要拟合的系数的下限向量。默认值为空向量,表示拟合不受下限约束。如果指定了界限,则向量长度必须等于系数的数量。单个不受约束的下限可以通过 -Inf 指定。
ub 要拟合的系数的上限向量。默认值为空向量,表示拟合不受上限约束。如果指定了界限,则向量长度必须等于系数的数量。可以通过 Inf 指定单个不受约束的上限。

定义多项式曲面拟合的多项式项

您可以通过指定 x 和 y 输入的次数来控制多项式曲面模型中包含的项。如果 i 是 x 的次数,j 是 y 的次数,则多项式的总次数是 i 和 j 中的最大值。每个项中 x 的次数小于或等于 i,每个项中 y 的次数小于或等于 j。i 和 j 的最大值均为 4。

例如:

   poly21  Z = p00 + p10*x + p01*y + p20*x^2 + p11*x*y

   poly13  Z = p00 + p10*x + p01*y + p11*x*y + p02*y^2
            + p12*x*y^2 + p03*y^3

例如,如果指定 x 度为 3,y 度为 2,则模型名称为 poly32。模型术语遵循此表中的形式。

项的次数 1 2 3
0 1 y y2
1 x xy xy2
2 x2 x2y N/A
3 x3 N/A N/A

多项式的总次数不能超过 的最大值。在此示例中, 等项被排除,因为它们的次数总和大于 3。在这两种情况下,总次数均为 4。

# 另请参阅

# APP

曲线拟合器

# 函数

fit | fittype | fitoptions

# 相关主题

多项式模型名称与方程