Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

交互式拟合

基本拟合用户界面

MATLAB® 基本拟合用户界面能让您以交互方式:

  • 利用样条插值、保形插值或最高 10 次的多项式进行数据建模

  • 绘制一个或多个数据拟合图

  • 绘制拟合的残差图

  • 计算模型系数

  • 计算残差范数(可用于分析模型与数据的拟合度的一种统计量)

  • 使用模型进行内插或在数据外部进行外插

  • 将系数及计算出的值保存到 MATLAB 工作区,以便在对话框外部使用

  • 生成 MATLAB 代码,以便用新数据重新计算拟合和重新生成绘图

注意

基本拟合用户界面仅可用于二维绘图。若要了解更先进的拟合及回归分析,请参阅 Curve Fitting Toolbox™ 文档和 Statistics and Machine Learning Toolbox™ 文档。

基本拟合准备

基本拟合用户界面在拟合前对数据进行升序排列。如果您的数据集较大且值未按升序排列,基本拟合用户界面在拟合前可能需要较长时间来预处理数据。

您可通过提前对数据进行排序,加快基本拟合用户界面的处理速度。若要通过数据向量 xy 创建排序向量 x_sortedy_sorted,请使用 MATLAB sort 函数:

[x_sorted, i] = sort(x);
y_sorted = y(i);

打开基本拟合用户界面

若要使用基本拟合用户界面,您必须首先利用(仅)产生 xy 数据的任何 MATLAB 绘图命令在图窗窗口中绘制数据。

若要打开基本拟合用户界面,请从图窗窗口顶部的菜单中选择工具 > 基本拟合

示例:使用基本拟合用户界面

此示例说明如何使用基本拟合用户界面拟合、可视化、分析、保存多项式回归以及为其生成代码。

加载和绘制人口普查数据

文件 census.mat 包含 1790 年至 1990 年的美国人口数据,以 10 年为间隔。

若要加载及绘制数据,请在 MATLAB 提示符下键入以下命令:

load census
plot(cdate,pop,'ro')

load 命令将以下变量添加至 MATLAB 工作区:

  • cdate - 包含从 1790 年到 1990 年(以 10 为增量)的年份列向量。它是预测变量。

  • pop - cdate 中每一年的美国人口列向量。它是响应变量。

数据向量按年以升序排列。该图将人口显示为年份的函数。

现在,您已准备好对数据进行方程拟合,以建立人口随时间增长的模型。

通过三次多项式拟合预测人口普查数据

  1. 在图窗窗口中选择工具 > 基本拟合,打开“基本拟合”对话框。

  2. 在“基本拟合”对话框的拟合的类型区域中,选中三次方复选框以对数据进行三次多项式拟合。

    MATLAB 根据您的选项拟合数据,并将三次回归线添加至图中,如下所示。

    在计算拟合时,MATLAB 遇到问题并发出以下警告:

    此警告指示计算出的该模型的系数对响应(测得的人口)中的随机误差敏感。它同时会提出一些建议,以帮助改进拟合。

  3. 继续使用三次拟合。由于您无法对人口普查数据添加新观测值,您可在重新计算拟合前将您拥有的值转换为 z 值以改进拟合。选中对话框右上角的中心化并缩放 x 轴数据复选框,使基本拟合工具执行转换。

    若要了解数据中心化和缩放的工作方式,请参阅了解基本拟合工具如何计算拟合

  4. 误差估计(残差) 下,选中显示残差 RMSE 复选框。选择条形图作为绘图样式

选择这些选项后,会将残差子图创建为一个条形图。

对于 1790 年之前,三次拟合是较差的预测变量,因为它显示在此期间人口呈递减趋势。该模型似乎更适合 1790 年之后的数据。但是,残差的模式显示该模型并不符合正态误差假设,而这正是最小二乘拟合的基础。图例中标识的 data 1 行是观测到的 x (cdate) 和 y (pop) 数据值。三次方 回归线显示对数据值进行中心化并缩放后的拟合。请注意,即使工具使用变换后的 Z 值计算拟合,该图仍以原始数据单位显示图窗。

为进行比较,请尝试在拟合的类型区域中选择另一个多项式方程来拟合人口普查数据。

查看和保存三次拟合参数

在“基本拟合”对话框中,点击展开结果按钮 以显示估计的系数和 RMSE。

通过点击“数值结果”面板上的导出到工作区按钮,将拟合数据保存至 MATLAB 工作区。“将拟合保存到工作区”对话框随即打开。

选中所有复选框后,点击确定以将拟合参数保存为 MATLAB 结构体 fit

fit
fit = 

  struct with fields:

     type: 'polynomial degree 3'
    coeff: [0.9210 25.1834 73.8598 61.7444]

现在,您可以在基本拟合用户界面以外将拟合结果用于 MATLAB 编程。

R2,决定系数

您可通过计算决定系数R 方 (R2),确定多项式回归预测您的观测数据的能力。R2 统计量的范围介于 0 至 1 之间,它用来度量自变量在预测因变量的值方面的可用度:

  • 接近 0 的 R2 值表示该拟合并不明显优于模型 y = constant

  • 接近 1 的 R2 表示自变量能够解释因变量的大部分变异。

R2 是根据残差计算的,残差是因变量的观测值与其拟合预测值之间的有符号差值。

residuals = yobserved - yfitted(1)

本示例中三次拟合的 R2 数值为 0.9988,位于“基本拟合”对话框中的拟合结果下。

要将三次拟合的 R2 数值与线性最小二乘拟合进行比较,请在拟合的类型下选择线性,并获得 R2 数值 0.921。此结果表明,人口数据的线性最小二乘拟合可解释其方差的 92.1%。由于此数据的三次拟合可解释该方差的 99.9%,该拟合似乎是更佳的预测变量。但是,由于三次拟合使用三个变量(x、x2 和 x3)进行预测,基本的 R2 值并不能完全反映该拟合的稳健性。评估多变量拟合优度的更合适的度量是调整 R2。若要了解关于计算和使用调整 R2 的信息,请参阅残差与拟合优度

内插和外插人口值

假设您希望使用三次模型对 1965 年(原始数据中并未提供的日期)的美国人口数据进行插值。

在“基本拟合”对话框的内插/外插数据下,输入 X 值 1965,并选中绘制计算的数据框。

注意

使用未经缩放和中心化的 X 值。您不需要先进行中心化和缩放,即使您在通过三次多项式拟合预测人口普查数据中选择了缩放 X 值以获得系数。“基本拟合”工具会在后台进行必要的调整。

根据拟合计算并绘制 X 值和 f(X) 的对应值,如下所示:

生成代码文件以重新生成结果

完成基本拟合会话后,您可生成 MATLAB 代码,该代码使用新数据重新计算拟合并重新生成绘图。

  1. 在图窗窗口中,选择文件 > 生成代码

    这将创建一个函数并在 MATLAB 编辑器中显示它。该代码向您说明如何以编程方式重现您与“基本拟合”对话框的交互操作。

  2. 将第一行上的函数名称从 createfigure 更改为更具体的名称,如 censusplot。将代码文件保存至当前文件夹,文件名为 censusplot.m。该函数的开头为:

    function censusplot(X1, Y1, valuesToEvaluate1)

  3. 生成一些新的随机扰动的人口普查数据:

    rng('default')
    randpop = pop + 10*randn(size(pop));
  4. 用新数据重新生成绘图并重新计算拟合:

    censusplot(cdate,randpop,1965)

    您需要三个输入参数:在原始图形中绘制的 x,y 值 (data 1),以及用于标记的 x 值。

    下图显示所生成的代码产生的绘图。新绘图与您生成的代码所产生的图窗外观相匹配,但 y 数据值、三次拟合的方程以及条形图中的残差值不同,这在意料之中。

了解基本拟合工具如何计算拟合

基本拟合工具调用 polyfit 函数计算多项式拟合。它调用 polyval 函数评估拟合。polyfit 分析它的输入,以确定数据的条件是否适合要求的拟合度。

若发现病态数据,polyfit 将尽其所能计算回归,但还会返回警告,表示拟合可以改善。基本拟合示例一节通过三次多项式拟合预测人口普查数据显示了该警告。

改善模型可靠性的一种方法是增加数据点。但是,向数据集添加观测值并非始终可行。替代策略是转换预测变量,对其中心化和缩放进行归一化。(在示例中,预测变量是人口普查日期的向量。)

通过计算 z 值polyfit 函数进行归一化:

z=xμσ

其中,x 是预测变量数据,μ 是 x 的均值,σ 是 x 的标准差。z 值为数据提供均值 0 和标准差 1。在基本拟合用户界面中,您通过选中中心化并缩放 x 轴数据复选框,将预测变量数据转换为 z 值。

中心化并缩放后,计算 y 数据作为 z 的函数时的模型系数。这些数据与 y 作为 x 的函数时计算所得的系数不同,且更为稳定。模型的形式与残差范数不变。基本拟合用户界面会自动重新缩放 z 值,以便按与原始 x 数据相同的比例绘制拟合图。

若要了解如何将中心化并缩放后的数据作为中间数据创建最终绘图,请在命令行窗口中运行以下代码:

close
load census
x = cdate;
y = pop;
z = (x-mean(x))/std(x); % Compute z-scores of x data

plot(x,y,'ro') % Plot data as red markers
hold on        % Prepare axes to accept new graph on top

zfit = linspace(z(1),z(end),100);
pz = polyfit(z,y,3); % Compute conditioned fit
yfit = polyval(pz,zfit);

xfit = linspace(x(1),x(end),100);
plot(xfit,yfit,'b-') % Plot conditioned fit vs. x data

中心化并缩放后的三次多项式绘制为一条蓝线,如下所示:

在代码中,z 的计算说明了如何对数据进行归一化。如果您在调用 polyfit 函数时提供三个返回变量,该函数将自行执行转换:

[p,S,mu] = polyfit(x,y,n)
返回的回归参数 p 现在基于归一化的 x。返回的向量 mu 包含 x 的均值和标准差。有关详细信息,请参阅 polyfit 参考页。