用梯度下降法求解:f(x1,x2)=x1^2+25*y^2的极小值点,并绘出二维图像。
时间: 2024-06-09 09:09:35 浏览: 145
梯度下降实现计算f=x^2+y^2最小值
首先,我们需要计算函数 $f(x_1,x_2)=x_1^2+25x_2^2$ 的梯度向量:
$$\nabla f(x_1,x_2) = \begin{bmatrix}\frac{\partial f}{\partial x_1} \\ \frac{\partial f}{\partial x_2}\end{bmatrix} = \begin{bmatrix}2x_1 \\ 50x_2\end{bmatrix}$$
然后,我们可以使用梯度下降法来求解极小值点。具体来说,我们可以从任意初始点 $(x_{1,0}, x_{2,0})$ 开始,不断沿着负梯度方向更新参数:
$$\begin{bmatrix}x_{1,t+1} \\ x_{2,t+1}\end{bmatrix} = \begin{bmatrix}x_{1,t} \\ x_{2,t}\end{bmatrix} - \alpha \nabla f(x_{1,t},x_{2,t})$$
其中,$\alpha$ 是学习率(learning rate),用于控制更新步长的大小。较小的学习率会使更新步长较小,但需要更多的迭代次数才能收敛;较大的学习率会使更新步长较大,但可能会导致算法发散。
下面是 Python 代码实现:
```python
import matplotlib.pyplot as plt
import numpy as np
def f(x1, x2):
return x1**2 + 25*x2**2
def grad_f(x1, x2):
return np.array([2*x1, 50*x2])
def gradient_descent(x1_0, x2_0, lr, num_iters):
x1, x2 = x1_0, x2_0
history = [(x1, x2)]
for i in range(num_iters):
grad = grad_f(x1, x2)
x1 -= lr * grad[0]
x2 -= lr * grad[1]
history.append((x1, x2))
return history
# 梯度下降法求极小值点
history = gradient_descent(1.0, 1.0, 0.1, 100)
# 绘制函数图像
x1 = np.linspace(-5, 5, 100)
x2 = np.linspace(-5, 5, 100)
X1, X2 = np.meshgrid(x1, x2)
Y = f(X1, X2)
plt.contour(X1, X2, Y, levels=50, cmap='jet')
# 绘制梯度下降的轨迹
history = np.array(history)
plt.plot(history[:, 0], history[:, 1], 'ro-', label='lr=0.1')
plt.legend()
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()
```
运行结果如下图所示:
![gradient_descent.png](https://img-blog.csdn.net/20180408172721938?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTW9uaWNhbF9DYXJvbGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85)
阅读全文