如何在 Python 中实现梯度下降以找到局部最小值?


梯度下降是机器学习中一种重要的优化方法,用于最小化模型的损失函数。通俗地说,它涉及到反复改变模型的参数,直到找到一组理想的值,从而使损失函数最小化。该方法通过沿着损失函数负梯度的方向(更具体地说,是沿着最陡下降路径)进行小步调整来工作。学习率是一个超参数,它控制着算法在速度和准确性之间的权衡,影响着步长的大小。许多机器学习方法,包括线性回归、逻辑回归和神经网络等,都使用了梯度下降。它的主要应用是在模型训练中,目标是最小化目标变量的预测值与实际值之间的差异。在这篇文章中,我们将探讨如何在 Python 中实现梯度下降以找到局部最小值。

现在是时候在 Python 中实现梯度下降了。以下是关于我们如何实现它的基本说明:

  • 首先,我们导入必要的库。

  • 定义函数及其导数。

  • 接下来,我们将应用梯度下降函数。

  • 应用函数后,我们将设置参数以找到局部最小值,

  • 最后,我们将绘制输出的图形。

在 Python 中实现梯度下降

导入库

import numpy as np import matplotlib.pyplot as plt

然后我们定义函数 f(x) 及其导数 f'(x) -

def f(x): return x**2 - 4*x + 6 def df(x): return 2*x - 4

F(x) 是需要减小的函数,df 是它的导数 (x)。梯度下降方法利用导数来指导自身向最小值方向前进,因为它揭示了函数沿途的斜率。

然后定义梯度下降函数。

def gradient_descent(initial_x, learning_rate, num_iterations): x = initial_x x_history = [x] for i in range(num_iterations): gradient = df(x) x = x - learning_rate * gradient x_history.append(x) return x, x_history

梯度下降函数接收 x 的初始值、学习率和所需的迭代次数作为输入。它将 x 初始化为其初始值并创建一个空列表来存储每次迭代后的 x 值。然后,该函数对给定的迭代次数执行梯度下降,根据公式 x = x - 学习率 * 梯度在每次迭代中更新 x。该函数返回每次迭代的 x 值列表以及 x 的最终值。

现在可以使用梯度下降函数来找到 f(x) 的局部最小值 -

示例

initial_x = 0 learning_rate = 0.1 num_iterations = 50 x, x_history = gradient_descent(initial_x, learning_rate, num_iterations) print("Local minimum: {:.2f}".format(x))

输出

Local minimum: 2.00

在这个例子中,x 最初设置为 0,学习率为 0.1,并运行 50 次迭代。最后,我们打印 x 的值,它应该接近 x=2 处的局部最小值。

绘制函数 f(x) 和每次迭代的 x 值的图形,我们可以观察到梯度下降过程。

示例

# Create a range of x values to plot x_vals = np.linspace(-1, 5, 100) # Plot the function f(x) plt.plot(x_vals, f(x_vals)) # Plot the values of x at each iteration plt.plot(x_history, f(np.array(x_history)), 'rx') # Label the axes and add a title plt.xlabel('x') plt.ylabel('f(x)') plt.title('Gradient Descent') # Show the plot plt.show()

输出

结论

总之,Python 使用称为梯度下降的有效优化过程来找到函数的局部最小值。梯度下降通过在每一步计算函数的导数,反复更新输入值,使其沿着最陡下降的方向移动,直到达到最小值。在 Python 中实现梯度下降包括指定要优化的函数及其导数、初始化输入值以及确定算法的学习率和迭代次数。优化完成后,可以通过跟踪算法到最小值的步骤并可视化它如何到达最小值来评估该方法。由于 Python 可以处理大型数据集和复杂的函数,因此梯度下降可以成为机器学习和优化应用中的有用技术。

更新于: 2023-04-25

3K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告