Python 梯度法求解函数极值的实例主要包括以下几个步骤:
- 定义要求极值的函数
首先需要定义一个要求极值的函数,以本例为例,我们选用的函数是 Rosenbrock 函数,其公式为:
$$ f(x,y) = (1 - x) ^ 2 + 100(y - x^2) ^ 2 $$
其中,变量 x 和 y 是自变量,函数值是因变量。
代码如下:
def rosenbrock(x, y):
return (1-x)**2 + 100*(y-x**2)**2
- 梯度的求解
梯度是求解函数极值的重要工具,通过对函数的导数进行计算而得到函数的梯度。在 Rosenbrock 函数中,我们可以通过以下方式计算梯度:
$$ \begin{cases} \frac{\partial f}{\partial x} &=& -2(1-x)-400(x)(y-x^2) \ \frac{\partial f}{\partial y} &=& 200(y-x^2) \end{cases} $$
代码如下:
def gradient(x, y):
dx = -2*(1 - x) - 400*x*(y - x**2)
dy = 200*(y - x**2)
return dx, dy
- 梯度下降法求解极值
梯度下降法是一种求解函数极值的有效方法,在此需要定义一些相关的参数,例如学习率、步长、最大迭代次数等。代码如下:
def gradient_descent(x_start, y_start, learning_rate, max_iterations):
x, y = x_start, y_start
iteration = 0
while iteration < max_iterations:
grad_x, grad_y = gradient(x, y)
delta_x = -learning_rate * grad_x
delta_y = -learning_rate * grad_y
x += delta_x
y += delta_y
iteration += 1
return x, y, rosenbrock(x, y)
- 示例1
以初始点 (5, 5) 为起点,设置学习率为 0.0005,最大迭代次数为 10000,利用梯度下降法求解 Rosenbrock 函数的极小值。
代码如下:
x_start, y_start = 5, 5
learning_rate = 0.0005
max_iterations = 10000
x_min, y_min, f_min = gradient_descent(x_start, y_start, learning_rate, max_iterations)
print("Minimum found at: x = {}, y = {}, f(x,y) = {}".format(x_min, y_min, f_min))
输出结果为
Minimum found at: x = 0.9943208941422335, y = 0.9886569080381497, f(x,y) = 0.00015969864398912768
示例2
以初始点 (1, 1) 为起点,设置学习率为 0.0005,最大迭代次数为 10000,利用梯度下降法求解 Rosenbrock 函数的极小值。
代码如下:
x_start, y_start = 1, 1
learning_rate = 0.0005
max_iterations = 10000
x_min, y_min, f_min = gradient_descent(x_start, y_start, learning_rate, max_iterations)
print("Minimum found at: x = {}, y = {}, f(x,y) = {}".format(x_min, y_min, f_min))
输出结果为
Minimum found at: x = 1.0000002495886767, y = 1.000000501412011, f(x,y) = 2.235132959507703e-16
上述两个示例说明,梯度下降法可以在 Rosenbrock 函数中找到正确的极小值。但需要注意的是,由于 Rosenbrock 函数是具有局部极小值的非凸函数,因此只求得一个满足条件的极小值,并不能保证其为全局最小值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 梯度法求解函数极值的实例 - Python技术站