梯度下降法Python代码详解

学习机器学习算法必不可少的就是梯度下降法。而Python作为一种易学易用的编程语言,自然也有很多开源库可以实现梯度下降法,如Numpy和SciPy等。本文将从多个方面详细探讨梯度下降法Python代码的实现。

一、梯度下降法Python代码初始值

梯度下降法通过不断迭代未知参数的值,达到求出最优解的目的。在使用Python实现梯度下降法之前,我们需要确定一些初始超参数,例如学习率和迭代次数等等。

学习率是控制参数每次迭代移动的程度,设置太小会导致梯度下降过慢,设置太大则可能会因为过度拟合而形成局部极小值。而迭代次数则是控制算法的时间长短和精度的高低,迭代次数太少可能无法得到最优解,迭代次数太多则会浪费时间和内存。

在实际应用中,我们可以通过多次试验不同的学习率和迭代次数,通过交叉验证来确定合适的参数,以达到最佳的模型。

二、梯度下降法Python实现

下面是使用Python实现梯度下降法的基本步骤:

  1. 初始化模型参数
  2. 计算代价函数
  3. 计算代价函数对模型参数的偏导数
  4. 更新模型参数
  5. 重复步骤2~4,直到达到收敛或者达到最大迭代次数

具体的Python代码如下所示:

import numpy as np

def gradient_descent(x, y, theta, alpha, iterations):
    m = len(y)
    for i in range(iterations):
        h = np.dot(x, theta)
        loss = h - y
        gradient = np.dot(x.T, loss) / m
        theta = theta - alpha * gradient
    return theta

其中,参数x和y表示输入数据的向量和标签的向量,theta表示参数的初始值向量,alpha表示学习率,iterations表示迭代次数。其中np.dot函数表示向量之间的点积操作,/表示矩阵分量之间进行除法。

三、梯度下降法Python代码二元函数

二元函数的梯度下降算法在Python中也可以轻松实现。下面的代码是一个简单的实现例子:

import numpy as np
import matplotlib.pyplot as plt

def gradient_descent(x, y, theta, alpha, iterations):
    m = len(y)
    J_history = np.zeros(iterations)

    for i in range(iterations):
        h = np.dot(x, theta)
        loss = h - y
        J_history[i] = np.sum(loss ** 2) / (2 * m)
        gradient = np.dot(x.T, loss) / m
        theta = theta - alpha * gradient

    return theta, J_history

def plot_data(x, y):
    plt.plot(x, y, 'o')
    plt.show()

def plot_cost(J_history, iterations):
    plt.plot(np.arange(iterations), J_history, 'r')
    plt.xlabel('Iterations')
    plt.ylabel('Cost Function')
    plt.show()

def main():
    x = np.array([1, 2, 3, 4, 5, 6])
    y = np.array([3, 6, 9, 12, 15, 18])
    x = x[:, np.newaxis]
    y = y[:, np.newaxis]
    m = len(y)
    iterations = 1000
    alpha = 0.01
    theta = np.zeros((2, 1))
    ones = np.ones((m, 1))
    x = np.hstack((ones, x))

    theta, J_history = gradient_descent(x, y, theta, alpha, iterations)

    plot_data(x[:, 1], y)
    plot_cost(J_history, iterations)

if __name__ == '__main__':
    main()

其中,代码首先声明了plot_data和plot_cost两个函数,分别用于绘制数据和绘制成本函数。然后在main函数中,我们构造了一个简单的一元线性模型,其假设函数为y = 3x,然后使用梯度下降法求解得出最优解,其中iterations=1000,alpha=0.01。

最后,我们绘制了数据的散点图和成本函数的变化趋势。可以看到,随着迭代次数的增加,成本函数J的值不断减小,最终收敛到最优解。

四、随机梯度下降法Python代码

随机梯度下降法(Stochastic Gradient Descent,SGD)是梯度下降法的一种变体,用于训练大数据集。SGD计算每次更新时仅选取一个样本进行计算代价函数和梯度,而不是全样本。下面是一个简单的实现例子:

import numpy as np

def stochastic_gradient_descent(x, y, theta, alpha, iterations):
    m = len(y)

    for i in range(iterations):
        random_index = np.random.randint(m)
        x_i = x[random_index : random_index + 1]
        y_i = y[random_index : random_index + 1]
        h = np.dot(x_i, theta)
        loss = h - y_i
        gradient = np.dot(x_i.T, loss)
        theta = theta - alpha * gradient

    return theta

其中,代码首先声明了sgd函数,表示SGD的求解过程。在函数中,我们首先通过np.random.randint从样本中随机选取一个样本,然后在计算梯度时仅使用该样本。最后,函数返回求得的最优参数theta。

五、Python梯度下降法原理

梯度下降法的核心思想是通过求解代价函数的梯度,从而不断更新参数的值,以达到最优的模型解。在Python中,该算法的基本原理可以概括为以下几个步骤:

  1. 初始化参数的值
  2. 计算代价函数的值
  3. 计算代价函数的梯度
  4. 更新参数的值
  5. 重复步骤2~4,直到满足收敛条件

需要注意的是,梯度下降法的收敛速度较慢,因此在实际应用中需要仔细调整学习率和迭代次数等超参数,以获得较优的结果。

六、Python实现梯度下降

下面是一个简单的二元函数的Python梯度下降实现过程:

import numpy as np
import matplotlib.pyplot as plt

def gradient_descent(x, y, theta, alpha, iterations):
    m = len(y)
    J_history = np.zeros(iterations)

    for i in range(iterations):
        h = np.dot(x, theta)
        loss = h - y
        J_history[i] = np.sum(loss ** 2) / (2 * m)
        gradient = np.dot(x.T, loss) / m
        theta = theta - alpha * gradient

    return theta, J_history

def plot_data(x, y):
    plt.plot(x, y, 'o')
    plt.show()

def plot_cost(J_history, iterations):
    plt.plot(np.arange(iterations), J_history, 'r')
    plt.xlabel('Iterations')
    plt.ylabel('Cost Function')
    plt.show()

def main():
    x = np.array([1, 2, 3, 4, 5, 6])
    y = np.array([3, 6, 9, 12, 15, 18])
    x = x[:, np.newaxis]
    y = y[:, np.newaxis]
    m = len(y)
    iterations = 1000
    alpha = 0.01
    theta = np.zeros((2, 1))
    ones = np.ones((m, 1))
    x = np.hstack((ones, x))

    theta, J_history = gradient_descent(x, y, theta, alpha, iterations)

    plot_data(x[:, 1], y)
    plot_cost(J_history, iterations)

if __name__ == '__main__':
    main()

可以看到,该代码实现了一个简单的一元函数线性拟合,其中学习率alpha=0.01,迭代次数iterations=1000。在运行完成后,代码还会绘制出数据的散点图和成本函数的变化趋势图。

七、小批量梯度下降Python

小批量梯度下降法(Mini-batch Gradient Descent)是介于梯度下降法和随机梯度下降法之间的一种算法。该算法通过综合全样本和单个样本的梯度,从而兼顾了批量算法和随机算法的优缺点。

下面是一个简单的实现例子:

import numpy as np

def minibatch_gradient_descent(x, y, theta, alpha, iterations, batch_size):
    m = len(y)
    for i in range(iterations):
        random_index = np.random.randint(m, size=batch_size)
        x_batch = x[random_index]
        y_batch = y[random_index]
        h = np.dot(x_batch, theta)
        loss = h - y_batch
        gradient = np.dot(x_batch.T, loss) / batch_size
        theta = theta - alpha * gradient
    return theta

其中,参数batch_size表示每一次迭代时所选取的样本数量,该算法会在全样本和单个样本算法之间进行权衡,以达到更快的学习和更稳定的效果。

八、总结

本文从多个方面详细展示了梯度下降法Python代码的实现方式,涵盖了梯度下降法的基础知识、二元函数、随机梯度下降法以及小批量梯度下降法等内容。在实际应用中,我们需要仔细挑选超参数,并通过多次试验和评估来求得最佳的模型解。希望本文对您有所帮助!

原创文章,作者:CTGLT,如若转载,请注明出处:https://www.506064.com/n/331244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CTGLTCTGLT
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相关推荐

  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29

发表回复

登录后才能评论