非线性优化:高斯-牛顿法的原理与实现
引言
在实际应用中,很多问题都是非线性的。非线性优化问题广泛应用于机器学习、数据拟合、工程设计等领域。高斯-牛顿法是一种常用于解决非线性最小二乘问题的迭代算法。本文将详细介绍高斯-牛顿法的原理、推导过程,并通过Python代码实现该算法。
高斯-牛顿法原理
问题定义
非线性最小二乘问题可以表示为:
min
x
∑
i
=
1
m
[
r
i
(
x
)
]
2
\min_{\mathbf{x}} \sum_{i=1}^m [r_i(\mathbf{x})]^2
xmini=1∑m[ri(x)]2
其中,
x
\mathbf{x}
x 是需要优化的参数向量,
r
i
(
x
)
r_i(\mathbf{x})
ri(x)是残差函数。
高斯-牛顿法
高斯-牛顿法的基本思想是利用泰勒展开对非线性函数进行线性近似,然后求解线性最小二乘问题。具体步骤如下:
- 初始猜测参数 x 0 \mathbf{x}_0 x0。
- 迭代更新参数
x
\mathbf{x}
x:
x k + 1 = x k − ( J T J ) − 1 J T r ( x k ) \mathbf{x}_{k+1} = \mathbf{x}_k - (\mathbf{J}^T \mathbf{J})^{-1} \mathbf{J}^T \mathbf{r}(\mathbf{x}_k) xk+1=xk−(JTJ)−1JTr(xk)
其中, J \mathbf{J} J 是残差函数 r ( x ) \mathbf{r}(\mathbf{x}) r(x)对参数 x \mathbf{x} x 的雅可比矩阵。
雅可比矩阵
雅可比矩阵
J
\mathbf{J}
J 的每个元素定义为:
J
i
j
=
∂
r
i
(
x
)
∂
x
j
J_{ij} = \frac{\partial r_i(\mathbf{x})}{\partial x_j}
Jij=∂xj∂ri(x)
Python实现
下面的代码展示了如何使用高斯-牛顿法解决非线性最小二乘问题。
示例问题
我们以一个简单的非线性函数为例:
y
=
a
exp
(
b
x
)
+
c
y = a \exp(b x) + c
y=aexp(bx)+c
给定一组数据点
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi),拟合参数
a
,
b
,
c
a, b, c
a,b,c。
代码实现
import numpy as np
import matplotlib.pyplot as plt
def residuals(params, x, y):
a, b, c = params
return y - (a * np.exp(b * x) + c)
def jacobian(params, x):
a, b, c = params
J = np.zeros((len(x), len(params)))
J[:, 0] = -np.exp(b * x)
J[:, 1] = -a * x * np.exp(b * x)
J[:, 2] = -1
return J
def gauss_newton(x, y, initial_params, max_iter=100, tol=1e-6):
params = np.array(initial_params)
for i in range(max_iter):
r = residuals(params, x, y)
J = jacobian(params, x)
delta = np.linalg.inv(J.T @ J) @ J.T @ r
params = params - delta
if np.linalg.norm(delta) < tol:
break
return params
# 生成示例数据
np.random.seed(0)
x = np.linspace(0, 1, 100)
a_true, b_true, c_true = 2, -1, 0.5
y_true = a_true * np.exp(b_true * x) + c_true
y_noisy = y_true + 0.1 * np.random.normal(size=x.size)
# 高斯-牛顿法拟合
initial_params = [1, -0.5, 0]
params_estimated = gauss_newton(x, y_noisy, initial_params)
# 输出结果
print("Estimated parameters:", params_estimated)
print("True parameters:", [a_true, b_true, c_true])
# 可视化拟合结果
y_fitted = params_estimated[0] * np.exp(params_estimated[1] * x) + params_estimated[2]
plt.scatter(x, y_noisy, label='Noisy data')
plt.plot(x, y_true, label='True function', linestyle='--')
plt.plot(x, y_fitted, label='Fitted function', color='red')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gauss-Newton Method for Nonlinear Least Squares')
plt.show()
代码说明
residuals
:计算残差函数 ( r(\mathbf{x}) )。jacobian
:计算雅可比矩阵 ( \mathbf{J} )。gauss_newton
:实现高斯-牛顿法的主函数。该函数迭代更新参数,直到收敛或达到最大迭代次数。- 示例数据生成与拟合:生成示例数据并使用高斯-牛顿法进行拟合,最后可视化结果。
结果展示
运行上述代码,可以得到拟合的参数估计值及其与真实值的比较,并通过图形展示拟合效果。
Estimated parameters: [ 2.00731989 -0.99971756 0.50021009]
True parameters: [2, -1, 0.5]
从结果可以看出,高斯-牛顿法能够较准确地估计非线性函数的参数。通过可视化图形,可以直观地看到拟合曲线与真实曲线之间的差异。
结论
高斯-牛顿法是一种强大且常用的非线性最小二乘优化方法。在处理非线性问题时,通过迭代更新参数,高斯-牛顿法可以有效地逼近全局最优解。本文介绍了高斯-牛顿法的原理、推导过程,并通过Python代码展示了如何应用该算法解决实际问题。
希望本文能够帮助您理解和应用高斯-牛顿法。如果您有任何问题或建议,欢迎在评论区留言讨论。