Python两个自变量的函数拟合

在数学和数据分析领域,函数拟合是一种通过给定的数据点,寻找最逼近这些数据点的函数的过程。在Python中,我们可以使用不同的方法来拟合函数,其中一种常见的方法是使用最小二乘法。

最小二乘法

最小二乘法是一种通过最小化观测值与模型预测值之间的残差平方和来估计参数的方法。在Python中,我们可以使用scipy库中的curve_fit函数来进行最小二乘法拟合。

首先,我们需要导入所需的库:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

假设我们想拟合一个二次函数,即有两个自变量x和y的函数。我们可以定义这个函数如下:

def quadratic_func(x, y, a, b, c):
    return a * x**2 + b * y + c

接下来,我们需要生成一些模拟数据点来进行拟合:

np.random.seed(0)
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x, y)
Z = quadratic_func(X, Y, 1, 2, 3) + np.random.normal(0, 1, X.shape)

在上述代码中,我们使用linspace函数生成了-10到10之间的100个数据点,并使用meshgrid函数生成了一个网格,并通过quadratic_func函数计算了每个网格点上的函数值。之后,我们为这些函数值添加了一些高斯噪声。

接下来,我们可以使用curve_fit函数来拟合这个二次函数:

popt, pcov = curve_fit(quadratic_func, (X, Y), Z)

在上述代码中,curve_fit函数的第一个参数是要进行拟合的函数,第二个参数是自变量的元组,第三个参数是因变量。它返回了拟合后的参数和协方差矩阵。

现在,我们可以使用拟合后的参数来预测新的自变量对应的因变量值:

x_new = np.linspace(-10, 10, 100)
y_new = np.linspace(-10, 10, 100)
X_new, Y_new = np.meshgrid(x_new, y_new)
Z_new = quadratic_func(X_new, Y_new, *popt)

在上述代码中,我们使用linspace函数生成了新的自变量值,并使用meshgrid函数生成了相应的网格。然后,我们使用拟合后的参数来计算新的因变量值。

最后,我们可以可视化原始数据点和拟合后的函数曲面:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X, Y, Z, c='b', label='Original data')
ax.plot_surface(X_new, Y_new, Z_new, color='r', alpha=0.5, label='Fitted surface')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.legend()
plt.show()

在上述代码中,我们使用matplotlib库的plot_surface函数来绘制拟合后的函数曲面,并使用scatter函数来绘制原始数据点。

序列图

下面是使用mermaid语法绘制的序列图,描述了函数拟合的过程:

sequenceDiagram
    participant User
    participant Python
    User->>Python: 定义二次函数
    User->>Python: 生成模拟数据点
    User->>Python: 调用curve_fit函数进行拟合
    User->>Python: 预测新的因变量值
    User->>Python: 可视化拟合曲面
    Note over Python: 返回拟合结果

状态图

下面是使用mermaid语法绘制的状态图,描述了函数拟合的状态转换:

stateDiagram
    [*] --> 定义二次函数
    定义二次函数 --> 生成模拟数据点
    生成模拟数据点 --> 调用curve_fit函数进行拟