leastsq() 函数来自于 scipy.optimize 模块,它用于执行最小二乘法拟合,即通过最小化误差的平方和来寻找一组参数,使得给定的函数尽可能好地拟合一组数据点。
leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)
主要参数解释如下:
func:一个可调用的函数,用于计算残差。残差是指观测值与模型预测值之间的差异。该函数接受参数 x(待优化的参数数组)以及其他额外参数(由 args 提供),并返回一个包含残差的数组。
x0:初始猜测值,是一个 NumPy 数组,包含了待优化参数的初始估计值。算法将从这个初始值开始迭代寻找最优解。
args:一个元组,包含传递给 func 函数的额外参数。如果 func 函数只需要 x 参数,那么 args 可以为空元组 ()。
Dfun:可选的雅可比矩阵函数。雅可比矩阵是残差函数关于待优化参数的一阶偏导数矩阵。如果提供了 Dfun,算法将使用它来加速收敛;如果不提供,算法将通过数值方法近似计算雅可比矩阵。
full_out:布尔值,默认为 False(即 0)。如果设置为 True(即 1),函数将返回更多详细的输出信息,包括协方差矩阵、迭代信息等;如果设置为 False,则只返回拟合得到的参数。
col_deriv:布尔值,默认为 False(即 0)。如果设置为 True(即 1),表示雅可比矩阵 Dfun 按列存储;如果设置为 False,则按行存储。
ftol
作用:浮点数,默认为 1.49012e-08。它是函数值的收敛公差,当残差平方和的相对变化小于 ftol 时,算法认为已经收敛。
xtol
作用:浮点数,默认为 1.49012e-08。它是参数值的收敛公差,当参数的相对变化小于 xtol 时,算法认为已经收敛。
gtol
作用:浮点数,默认为 0.0。它是梯度的收敛公差,当雅可比矩阵的转置与残差向量的点积的范数小于 gtol 时,算法认为已经收敛。
maxfev
作用:整数,默认为 0。它表示允许的最大函数调用次数。如果设置为 0,则根据参数数量自动确定最大调用次数。当达到最大调用次数时,算法停止迭代。
epsfcn
作用:浮点数,默认值为 None。它用于数值计算雅可比矩阵时的步长。如果不提供,算法将根据机器精度自动确定步长。
factor
作用:浮点数,默认为 100。它是初始步长的缩放因子,影响算法的初始搜索步长。
diag
作用:NumPy 数组,默认为 None。它用于对参数进行缩放,以改善算法的收敛性能。如果提供了 diag,算法将在计算过程中对参数进行缩放。
代码使用示列:
import numpy as np
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
# 生成一些示例数据
x_data = np.array([1, 2, 3, 4, 5])
y_data = np.array([2.1, 3.9, 6.2, 8.1, 10.2])
# 定义残差函数
def residuals(params, x, y):
a, b = params
# 计算线性函数的预测值
y_pred = a * x + b
# 计算残差
return y - y_pred
# 初始猜测值
initial_guess = [1, 0]
# 使用 leastsq 进行最小二乘法拟合
result, cov_x, infodict, mesg, ier = leastsq(residuals, initial_guess, args=(x_data, y_data), full_output=True)
# 提取拟合得到的参数
a_fit, b_fit = result
print(f"拟合得到的参数 a: {a_fit}, b: {b_fit}")
# 绘制原始数据和拟合曲线
plt.scatter(x_data, y_data, label='Original data')
plt.plot(x_data, a_fit * x_data + b_fit, 'r-', label='Fitted line')
plt.legend()
plt.show()
运行结果: