Python 中的曲线拟合

2025年3月17日 | 阅读 8 分钟

引言

曲线拟合是一种优化,用于为适用于给定观测集定义的函数找到最优参数集。

与监督学习不同,曲线拟合要求我们定义将示例输入映射到输出的函数。

用于映射的函数也称为基函数,它可以构成我们想要的任何内容,例如直线(线性回归)、曲线(多项式回归)等。此映射函数提供了定义曲线形状的灵活性和控制力,并通过优化过程来查找函数的特定最优参数。

在接下来的教程中,我们将了解什么是曲线拟合以及如何在 Python 中执行它。

在本教程结束时,我们将理解以下内容:

  1. 曲线拟合包括找到函数的最佳参数,将示例输入映射到输出。
  2. SciPy Python 库提供了一个应用程序接口 (API),用于将曲线拟合到数据集。
  3. 使用 SciPy 中的曲线拟合将各种不同的曲线拟合到观测集。

理解曲线拟合

正如我们之前讨论的,曲线拟合是一个优化问题,它允许我们找到一条适合一组观测值的直线。

将其想象成二维图表中的曲线拟合会更容易。

假设我们已经从问题域收集了数据示例,包括输入和输出。

图表的 x 轴充当独立变量,即函数的输入。另一方面,y 轴充当因变量,即函数的输出。我们可能不知道将示例输入映射到输出的函数形式;但是,我们可以使用标准函数形式来近似该函数。

曲线拟合包括以下阶段:

  1. 首先,定义映射函数(也称为目标函数或基函数)的函数形式。
  2. 其次,搜索导致最小误差的函数参数。

误差使用域提供的观测值来估计,将输入传递给候选目标函数并估计输出。计算出的输出与实验输出进行比较。

拟合完成后,我们可以使用基函数对域中的新点进行插值或外插。通常通过使用基函数处理一系列输入值来估计一系列输出值。之后,我们根据结果绘制线图,显示输入和输出之间的变化,并将拟合线放在观测点上。

曲线拟合的解释是基函数的形式。输入和输出之间的直线可以用下面的公式描述:

y = a × x + b

其中 y 是估计输出,x 是输入,ab 是通过优化算法找到的基函数参数。

这个方程称为线性方程,因为它是由输入的加权组合构成的。

在线性回归模型中,这些参数表示为系数,而在神经网络中,这些参数称为权重。

我们可以将此方程推广到任意数量的输入,这意味着曲线拟合的概念不限于二维(其中一个是输入,另一个是输出)。然而,它可能包含多个输入变量。

例如,两个输入变量的直线目标函数的公式可能如下所示:

y = a1 × x1 + a2 × x2 + b

方程不一定看起来像一条直线。

我们可以通过插入指数来定义目标函数的曲线。例如,我们可以插入由另一个参数加权的输入平方版本,如下所示:

y = a × x + b × x2 + c

这个方程称为多项式回归,其中平方项指的是二阶多项式。

这类线性方程可以通过最小二乘法拟合并进行解析估计,这意味着我们可以借助一些线性代数找到参数的最优值。

有些人可能还想在方程中包含其他数学函数,例如 sin、cos、tan 等。每个项都由一个参数加权,并加到整个方程中以产生以下输出:

y = a × sin(b × x) + c

通过向目标函数添加任意数学函数,我们无法解析估计参数;但是,我们需要使用迭代优化算法。

此方程被认为是非线性最小二乘法,因为映射函数不再是凸的(它是非线性的),并且求解相对不那么容易。

既然我们已经成功理解了什么是曲线拟合,现在是时候开始学习如何在 Python 中进行曲线拟合了。

在 Python 中执行曲线拟合

可以使用 Python 对数据集执行曲线拟合。Python 提供了一个名为 SciPy 包的开源库。这个 SciPy 包包含一个名为 curve_fit() 的函数,用于通过非线性最小二乘法进行曲线拟合。

curve_fit() 函数除了要使用的目标函数的名称外,还需要相同的输入和输出数据作为参数。

目标函数必须包含输入数据示例和一些参数。其余的参数将成为非线性最小二乘优化过程将要优化的系数或权重常数。

让我们来看一个示例演示来理解这个概念。

假设我们有从域中加载的几个观测值,其中 x 是输入变量的数量,y 是输出变量的数量。

语法

现在,我们需要设计一个目标函数来拟合数据,并将其实现为一个接受输入和参数的 Python 函数。

让我们假设该函数是一条直线,如下所示:

语法

函数定义后,我们可以调用 curve_fit() 函数来通过定义的映射函数拟合数据集中的直线。

curve_fit() 函数将返回目标函数的最佳值,例如系数的值。该函数还将返回计算参数的协方差矩阵;但是,这可以暂时忽略。

语法

成功拟合后,我们可以利用最优参数和目标函数映射()来评估任何主观输入的输出。

此函数可能涉及我们已经从域中收集的示例的输出。它可能包含一些可以内插观测值的新值。它还可能包含超出观测值范围的外插值。

语法

既然我们已经了解了如何使用曲线拟合的 API,让我们来看一个实际示例。

Python 曲线拟合的实际示例

让我们从导入项目所需的包和库开始。

语法

导入包后,我们需要为程序提供测试数据以实现曲线拟合。因此,我们将定义基本的输入数据 x 和输出数据 y,如下所示。

语法

之后,我们将定义一些映射函数,以利用 curve_fit() 方法并验证它们在拟合方面的差异。我们将使用下面显示的方程作为映射函数:

  1. y = ax2 + bx + c
  2. y = ax3 + bx + c
  3. y = ax3 + bx2 + c
  4. y = a × exp?(bx) + c

相同过程在以下语法中有所描述:

语法

使用 curve_fit() 函数拟合数据非常简单,它分别提供映射函数、数据 x 和 y。curve_fit() 方法将返回最优参数和计算的协方差值作为输出。

语法

输出

Arguments:  [-0.08139835  0.8636481  11.1362229 ]
Co-Variance:  [[ 2.38376125e-04 -3.81401800e-03  9.53504499e-03]
 [-3.81401800e-03  6.55534344e-02 -1.88793892e-01]
 [ 9.53504499e-03 -1.88793892e-01  7.79966692e-01]]

正如我们所观察到的,curve_fit() 函数评估了最优参数和协方差。然后我们为用户打印了这些值。

我们将通过将目标函数和数据 x、y 配置到 curve_fit() 方法中来开始拟合数据,并获取包含 a、b、c 参数值的结果数据。由于我们不在此处使用协方差值,因此可以跳过它。之后,我们将使用导出的 a、b、c 值为每个函数估算拟合的 y 值。

语法

最后,我们将绘制图形以直观地验证差异。相同语法的示例如下:

语法

程序的最终图表如下所示:

Graph

Curve Fit in Python