1. 梯度下降算法简介
梯度下降算法是一种常用的最优化算法,可以用来寻找一个函数的局部最小值。它的基本思想是从当前位置出发,沿着函数的梯度方向不断移动,直到到达局部最小值。梯度下降算法的公式如下:
θ = θ - α * ?J / ?θ
其中,θ是要求解的参数,J是损失函数,α是学习率,?J / ?θ是损失函数对θ的偏导数。
2. 梯度下降算法的实现
梯度下降算法在Python中的实现需要用到以下几个步骤:
2.1 定义损失函数
梯度下降算法的核心是找到损失函数的最小值。因此,我们需要先定义损失函数。在这里,我们以二次损失函数为例:
def loss_function(theta):
return (theta - 3) ** 2 + 2
该函数的最小值为2,当θ=3时取得。
2.2 计算梯度
梯度下降算法需要计算损失函数对θ的偏导数。在这里,我们可以手动求解偏导数,也可以使用Python中的自动求导工具。在这里,我们使用Python中的Numpy库来计算梯度:
import numpy as np
def gradient(theta):
return 2 * (theta - 3)
2.3 执行梯度下降算法
有了损失函数和梯度函数,我们就可以使用梯度下降算法来寻找函数的最小值。以下是一个梯度下降算法的示例代码:
def gradient_descent(initial_theta, alpha, num_iters):
theta = initial_theta
for i in range(num_iters):
grad = gradient(theta)
theta = theta - alpha * grad
print("Iteration", i, ":", theta)
return theta
theta = gradient_descent(0, 0.1, 10)
print("Final theta:", theta)
该代码设置初始θ为0,学习率α为0.1,迭代次数num_iters为10。在每次迭代中,算法根据当前的θ计算出梯度,然后向负梯度方向改变θ的值。在本例中,最终的θ为2.997。
3. 梯度下降算法的可视化
为了更直观地理解梯度下降算法的过程,我们可以使用Python中的Matplotlib库来可视化梯度下降算法的过程。以下是一个可视化梯度下降算法过程的示例代码:
import matplotlib.pyplot as plt
def visualize_gradient_descent(initial_theta, alpha, num_iters):
theta = initial_theta
thetas = [theta]
for i in range(num_iters):
grad = gradient(theta)
theta = theta - alpha * grad
thetas.append(theta)
x_vals = np.linspace(-10, 10, 100)
y_vals = loss_function(x_vals)
plt.plot(x_vals, y_vals)
plt.plot(thetas, [loss_function(theta) for theta in thetas], 'rx')
plt.xlabel('theta')
plt.ylabel('loss')
plt.show()
visualize_gradient_descent(0, 0.1, 10)
该代码使用Matplotlib库绘制了一个二次损失函数的曲线和梯度下降的路径。在本例中,我们设置初始θ为0,学习率α为0.1,迭代次数num_iters为10。从图中可以看出,在梯度下降的过程中,θ的值从0逐渐降低,最终接近于2.997。
4. 总结
梯度下降算法是一种常用的最优化算法,可以用来寻找一个函数的局部最小值。在Python中实现梯度下降算法需要先定义损失函数和梯度函数,然后根据梯度下降的公式迭代更新θ的值,直到收敛到最小值。使用Matplotlib库可以可视化梯度下降的过程,从而更好地理解算法的原理。