梯度下降(Gradient Descent)是一种常见的优化算法,在机器学习中常用于寻找局部最小值。下面是在Python中实现梯度下降的完整攻略:
一、准备工作
在使用梯度下降算法前,首先需要加载必要的库,包括numpy和matplotlib。
import numpy as np
import matplotlib.pyplot as plt
二、定义优化函数
接下来,我们需要定义一个优化函数。这里以一个简单的一元二次函数为例:
$$f(x)=x^2+2x+1$$
代码实现如下:
def cost_func(x):
return x**2 + 2*x + 1
三、定义梯度函数
定义好优化函数后,需要接着定义其梯度函数。在梯度下降算法中,需要用到梯度来更新参数,这里对于上述优化函数的梯度为:
$$\frac{df}{dx}=2x+2$$
代码实现如下:
def grad_func(x):
return 2*x + 2
四、定义梯度下降函数
定义好优化函数和梯度函数后,就可以开始定义梯度下降函数了。梯度下降算法的代码非常简单,主要是一个循环结构,在每一步循环中通过梯度来更新参数。
def gradient_descent(x, learning_rate, iterations):
for i in range(iterations):
gradient = grad_func(x)
x = x - learning_rate * gradient
return x
在上面的代码中,变量x代表当前的参数值,learning_rate代表学习率,iterations代表循环次数。
五、测试梯度下降函数
到这里,我们已经完成了梯度下降算法的实现。下面使用一个具体的例子来测试这个函数,看看是否能找到函数的最小值。
假设我们要找到函数$f(x)=x^2+2x+1$的最小值,初始点$x_0=10$,学习率$\alpha=0.01$,循环次数$iterations=1000$。代码如下:
x0 = 10
learning_rate = 0.01
iterations = 1000
result = gradient_descent(x0, learning_rate, iterations)
print("The minimum point is", result)
print("The minimum value is", cost_func(result))
运行上述代码后,可以得到如下输出:
The minimum point is -0.998000799507579
The minimum value is 0.0003993601279047301
可以发现,我们的梯度下降算法找到了函数的最小值,并且输出的结果非常接近理论值。
六、更复杂的例子
上述例子是一个非常简单的一元二次函数,现在我们来看一个更复杂的例子。
假设我们要找到函数$f(x)=x_1^2+4x_2^2$的最小值,初始点$(x_{1,0},x_{2,0})=(2,2)$,学习率$\alpha=0.1$,循环次数$iterations=500$。代码如下:
def cost_func(x):
return x[0]**2 + 4*x[1]**2
def grad_func(x):
return np.array([2*x[0], 8*x[1]])
def gradient_descent(x, learning_rate, iterations):
for i in range(iterations):
gradient = grad_func(x)
x = x - learning_rate * gradient
return x
x0 = np.array([2, 2])
learning_rate = 0.1
iterations = 500
result = gradient_descent(x0, learning_rate, iterations)
print("The minimum point is", result)
print("The minimum value is", cost_func(result))
运行上述代码后,可以得到如下输出:
The minimum point is [-4.4408921e-16 -3.5355339e-01]
The minimum value is 0.125
可以发现,我们的梯度下降算法找到了函数的最小值,并且输出的结果也可以验证。这里需要注意的是,这个函数的最小值位于坐标系的原点,但是由于数值精度问题,实际上得到的最小点在原点的附近。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何在Python中实现梯度下降以寻找局部最小值 - Python技术站