图文详解梯度下降算法的原理及Python实现

图文详解梯度下降算法的原理及Python实现

梯度下降算法是机器学习中最常用的优化算法之一,它的主要作用是通过迭代的方式,不断调整模型参数使得模型的损失函数最小化。本文将详细讲解梯度下降算法的原理及Python实现,以及两个示例说明。

梯度下降算法原理

梯度下降算法的基本思想是通过不断调整模型参数,使得模型的损失函数最小化。具体来说,算法的步骤如下:

  1. 随机初始化模型参数;
  2. 计算模型的损失函数;
  3. 计算损失函数对模型参数的梯度;
  4. 根据梯度调整模型参数;
  5. 重复步骤2-4,直到损失函数收敛或达到最大迭代数。

其中,步骤3是梯度下降算法的核心,它的目的是计算损失函数对模型参数的梯度,以根据梯度调整模型参数。具体来说,对于一个模型参数 $\theta_i$,它的梯度可以表示为:

$$\frac{\partial J(\theta)}{\partial \theta_i}$$

其中,$J(\theta)$ 表示模型的损失函数,$\theta$ 表示模型的参数向量。

在计算梯度时,我们可以使用链式法则将损失函数的梯度表示为各个参数的偏导数之积。具体来说,对于一个多元函数 $f(x_1, x_2, ..., x_n)$,它的偏导数可以表示为:

$$\frac{\partial f}{\partial x_i} = \frac{\partial f}{\partial x_{i+1}} \cdot \frac{\partial x_{i+1}}{\partial x_i}$$

通过不断使用链式法则,我们可以将损失函数的梯度表示为各个参数的偏导数之积,从而计算出模型参数的梯度。

梯度下降算法Python实现

在Python中,我们可以使用NumPy库实现梯度下降算法。下面是一个简单的示例代码,用于对一个线性回归模型进行训练。

import numpy as np

# 定义模型
def model(X, theta):
    return X.dot(theta)

# 定义损失函数
def cost_function(X, y, theta):
    m = len(y)
    J = np.sum((model(X, theta) - y) ** 2) / (2 * m)
    return J

# 定义梯度下降算法
def gradient_descent(X, y, theta, alpha,_iters):
    m = len(y)
    J_history = np.zeros(num_iters)

    for i in range(num_iters):
        theta = theta - alpha * (X.T.dot(model(X, theta) - y) / m)
        J_history[i] = cost_function(X, y, theta)

    return theta, J_history

# 加载数据
data = np.loadtxt('data.csv', delimiter=',')
X = data[:, :-1]
y = data[:, -1]

# 在X前面添加一1,以便计算截距
X = np.hstack((np.ones((len(y), 1)), X))

# 随机初始化模型参数
theta = np.random.randn(X.shape[1])

# 设置学习率和迭代次数
alpha = 0.01
num_iters = 1000

# 运行梯度下降算法
theta, J_history = gradient_descent(X, y, theta, alpha, num_iters)

# 输出模型参数和损失函数的历史记录
print('theta:', theta)
print('J_history:', J_history)

在这个示例中,我们首先定义了一个线性回归模型和损失函数。然后,我们使用NumPy库加载数据,并在数据前面添加一列1,以便计算截距。接下来,我们随机初始化模型参数,并设置学习率和迭代次数。最后,我们使用定义的梯度下降算法对模型进行训练,并输出模型参数和损失函数的历史记录。

示例1:线性回归

在这个示例中,我们将使用梯度下降算法对一个线性回归模型进行训练,以便预测房价。

import numpy as np
import matplotlib.pyplot as plt

# 加载数据
data = np.loadtxt('data.csv', delimiter=',')
X = data[:, :-1]
y = data[:, -1]

# 在X前面添加一列1,以便计算截距
X = np.hstack((np.ones((len(y), 1)), X))

# 随机初始化模型参数
theta = np.random.randn(X.shape[1])

# 设置学习率和迭代次数
alpha = 0.01
num_iters = 1000

# 运行梯度下降算法
m = len(y)
J_history = np.zeros(num_iters)

for i in range(num_iters):
    theta = theta - alpha * (X.T.dot(X.dot(theta) - y) / m)
    J_history[i] = np.sum((X.dot(theta) - y) ** 2) / (2 * m)

# 输出模型参数和损失函数的历史记录
print('theta:', theta)
print('J_history:', J_history)

# 绘制损失函数的历史记录
plt.plot(J_history)
plt.xlabel('Iterations')
plt.ylabel('Cost')
plt.show()

在这个示例中,我们首先使用NumPy库加载数据,并在数据前面添加一列1,以便计算截距。接下来,我们随机初始化模型参数,并设置学习率和迭代次数。然后,我们使用梯度下降算法对模型进行训练,并输出模型参数和损失函数的历史记录。最后,我们使用Matplotlib库绘制损失函数的历史记录。

示例2:逻辑回归

在这个示例中,我们将使用梯度下降算法对一个逻辑回归模型进行训练,以便预测肿瘤为恶性。

import numpy as np
import matplotlib.pyplot as plt

# 加载数据
data = np.loadtxt('data.csv', delimiter=',')
X = data[:, :-1]
y data[:, -1]

# 在X前面添加一列1,以便计算截距
X = np.hstack((np.ones((len(y), 1)), X))

# 随机初始化模型参数
theta = np.random.randn(X.shape[1])

# 设置学习率和迭代次数
alpha = 0.01
num_iters = 1000

# 定义sigmoid函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 定义损失函数
def cost_function(X, y, theta):
    m = len(y)
    h = sigmoid(X.dot(theta))
    J = -np.sum(y * np.log(h) + (1 - y) * np.log(1 - h)) / m
    return J

# 定义梯度下降算法
def gradient_descent(X, y, theta, alpha, num_iters):
    m = len(y)
    J_history = np.zeros(num_iters)

    for i in range(num_iters):
        h = sigmoid(X.dot(theta))
        theta = theta - alpha * (X.T.dot(h - y) / m)
        J_history[i] = cost_function(X, y, theta)

    return theta, J_history

# 运行梯度下降算法
theta, J_history = gradient_descent(X, y, theta, alpha, num_iters)

# 输出模型参数和损失函数的历史记录
print('theta:', theta)
print('J_history:', J_history)

# 绘制损失函数的历史
plt.plot(J_history)
plt.xlabel('Iterations')
plt.ylabel('Cost')
plt.show()

在这个示例中,我们首先使用NumPy库加载数据,并在数据前面添加一列1,以便计算截距。接下来,我们随机初始化模型参数,并设置学习率和迭代数。然后,我们定义了sigmoid函数和损失函数,并使用梯度下降算法对模型进行训练。最后,我们输出模型参数损失函数的历史记录,并使用Matplotlib库绘制损失函数的历史记录。

总结

本文详细讲解了梯度下降算法的原理及Python实现,以及两个示例说明。梯度下降算是机器学习中最常用的优化算法之一,它的主要作用是通过迭代的方式,不断调整模型参数,使得模型的损失函数最小化。在实际应用中,我们可以根据具体的需求选择不同的损失函数和学习率,并结合其他优化算法进行综合处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图文详解梯度下降算法的原理及Python实现 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python实现连点器的示例代码

    下面是Python实现连点器的示例代码的完整攻略: 思路: 通过pyautogui库实现鼠标和键盘的控制; 读取图像并获取需要点击的坐标; 循环点击坐标位置 步骤: 第一步:准备工作 安装pyautogui库 导入所需库 import pyautogui import time import cv2 as cv import numpy as np 第二步:…

    python 2023年5月19日
    00
  • python 读取文本文件的行数据,文件.splitlines()的方法

    Python读取文本文件的行数据,文件.splitlines()的方法 本文将介绍如何使用Python读取文本文件的行数据,并介绍文件.splitlines()方法的用法。以下是本文将介绍的内容: 打开文本文件 读取文本文件的行数据 文件.splitlines()方法的用法 示例说明 打开文本文件 在Python中,我们可以使用open()函数打开文本文件。…

    python 2023年5月14日
    00
  • Python编写合并字典并实现敏感目录的小脚本

    首先我们来分步骤讲解如何编写合并字典并实现敏感目录的小脚本。 步骤1:编写合并字典脚本 为了实现更好的代码复用性,我们需要分离出一个用于合并字典的函数。具体代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- def merge_dict(x, y): z = x.copy() z.update(y) retu…

    python 2023年5月13日
    00
  • python爬虫beautiful soup的使用方式

    BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它提供了一种简单的方式来遍历文档、搜索文档树、修改文档内容等。以下是详细的攻略,介绍如何使用Python爬虫BeautifulSoup: 安装BeautifulSoup 在使用BeautifulSoup之前,需要先安装它。可以使用pip命令来安装BeautifulSoup。…

    python 2023年5月14日
    00
  • 如何写python的配置文件

    下面是关于如何写Python的配置文件的完整攻略。 1. 什么是配置文件 在编写 Python 程序过程中,为了方便对不同变量和设置进行管理,我们可以使用配置文件。配置文件就是一种文本文件,其中包含了各种变量和配置的值,以及程序需要用到的其它协议和设置。配置文件通常采用 key/value 的形式。 Python 提供了标准库 ConfigParser,用于…

    python 2023年5月13日
    00
  • Python办公自动化之将任意文件转为PDF格式

    对于“Python办公自动化之将任意文件转为PDF格式”的完整实例教程,我会分成以下几个模块来介绍: 简介与环境准备 安装所需库 将 Office 格式转换为 PDF 格式 将其他格式转换为 PDF 格式 示例说明 1. 简介与环境准备 PDF 是一种通用的文件格式,而 Office 文件更是我们使用最为频繁的文件格式之一。在业务中,我们往往需要将 Offi…

    python 2023年5月13日
    00
  • 两行代码解决Jupyter Notebook中文不能显示的问题

    下面是详细讲解“两行代码解决Jupyter Notebook中文不能显示的问题”的完整攻略。 问题描述 在使用Jupyter Notebook时,如果输出中文字符,可能会出现乱码或无法显示中文的问题。这是因为Jupyter Notebook默认的字符编码是UTF-8,而中文缺省的编码方式是GBK或GB2312。因此,需要设置Jupyter Notebook的…

    python 2023年5月20日
    00
  • Python Markdown 的“TOC”类中的编号列表

    【问题标题】:Numbered List in a `TOC` Class by Python MarkdownPython Markdown 的“TOC”类中的编号列表 【发布时间】:2023-04-03 07:25:02 【问题描述】: 我使用 Python Markdown 生成一个 HTML 文档。目录嵌入在 toc 类中。 我希望列表是数字: 1.…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部