当前位置:   article > 正文

利用梯度下降算法求罗宾逊函数的最小值【python,算法,机器学习】_rosenbrock函数 梯度下降法

rosenbrock函数 梯度下降法

梯度下降法是一种优化算法,用于寻找函数的局部最小值。该方法的核心思想是:从函数的某个初始点出发,沿着函数梯度的反方向进行迭代搜索。

以下是使用梯度下降法来找Rosenbrock函数最小值的详细步骤:

  1. 对于Rosenbrock函数 f ( x , y ) = ( a − x ) 2 + b ∗ ( y − x 2 ) 2 f(x,y)=(a−x)^2+b*(y−x^2)^2 f(x,y)=(ax)2+b(yx2)2,需要找到其梯度,然后更新当前点 $(x, y)
    。梯度由偏导数组成。对于 ‘ R o s e n b r o c k ‘ 函数,梯度是: 。梯度由偏导数组成。对于`Rosenbrock`函数,梯度是: 。梯度由偏导数组成。对于Rosenbrock函数,梯度是:∇f(x, y) = [∂f/∂x, ∂f/∂y]$。其中:
    ∂ f / ∂ x = − 2 ( a − x ) − 4 b ∗ x ∗ ( y − x 2 ) ∂f/∂x = -2(a - x) - 4b*x*(y - x^2) f/x=2(ax)4bx(yx2)
    ∂ f / ∂ y = 2 b ∗ ( y − x 2 ) ∂f/∂y = 2b*(y - x^2) f/y=2b(yx2)
  2. 在每次迭代中,将当前点 ( x , y ) (x, y) (x,y) 沿梯度的反方向移动一小步,步长由学习率 α α α 决定,更新规则为:
    x : = x − α ∗ ∂ f / ∂ x x := x - α * ∂f/∂x x:=xαf/x
    y : = y − α ∗ ∂ f / ∂ y y := y - α * ∂f/∂y y:=yαf/y
  3. 迭代持续进行,直到达到停止条件,比如梯度小于某个阈值,或者达到预设的迭代次数。

以下是根据上述思路提供的使用梯度下降法寻找Rosenbrock函数最小值的 Python 代码实现示例:

# 定义计算非凸函数的值的函数,参数 point 表示点的坐标,a 和 b 是常数
def Rosenbrock(point, a=1, b=100):
	x, y = point
	return (a - x) ** 2 + b * (y - x ** 2) ** 2


# 定义计算非凸函数在给定点的梯度值的函数,参数 point 表示点的坐标,a 和 b 是常数
def rosenbrock_gradient(point, a=1, b=100):
	x, y = point
	df_dx = -2 * (a - x) - 4 * b * x * (y - x ** 2)
	df_dy = 2 * b * (y - x ** 2)
	return df_dx, df_dy


# 定义使用梯度下降法在给定的迭代次数内寻找非凸函数的最小值的函数
def gradient_descent(start_point, learning_rate, max_iterations, tolerance):
	current_point = start_point
	for _ in range(max_iterations):
		df_dx, df_dy = rosenbrock_gradient(current_point)
		new_x = current_point[0] - learning_rate * df_dx
		new_y = current_point[1] - learning_rate * df_dy
		# 计算新点处的非凸函数的值
		current_value = Rosenbrock(current_point)
		new_value = Rosenbrock((new_x, new_y))
		# 如果函数值变化不大,则停止迭代
		if abs(new_value - current_value) < tolerance:
			break
		current_point = (new_x, new_y)
	return current_point


# 设置参数,初始点,学习率,最大迭代次数和容忍度。
initial_point = (-2, 2)
learning_rate = 0.001
max_iterations = 100000
tolerance = 1e-6
# 运行梯度下降法
minimum_point = gradient_descent(initial_point, learning_rate, max_iterations,
                                 tolerance)
print(f"最小值为 {minimum_point}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

这段代码定义了Rosenbrock函数及其梯度,并实现了梯度下降法来找到函数的最小值。

请注意,代码中的gradient_descent函数接受初始点、学习率、最大迭代次数和容忍度作为参数,在实际应用中,你需要根据需求调整这些参数便于获得更好的结果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/617879
推荐阅读
相关标签
  

闽ICP备14008679号