图文详解梯度下降算法的原理及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每次处理固定个数的字符的方法总结”的完整攻略。 1. 字符串分割法 字符串分割方法,即将字符串按照固定的字符数进行切分,分隔符可以使用正则表达式,也可以指定需要切分的长度。 下面是使用指定长度切割的例子: string = "hello world, this is a test string." size …

    python 2023年6月5日
    00
  • Python中字符串的修改及传参详解

    Python中字符串的修改及传参详解 在Python中,字符串是不可变对象,即一旦创建后就不能被修改。但是在某些情况下,我们需要对字符串做修改或传参,这时候就需要借助一些技巧来实现。本攻略将为您详细讲解Python中字符串的修改及传参方法。 字符串的修改 Python中的字符串是不可变对象,因此不能直接对其进行修改。但是可以通过字符串的切片、拼接等方法来实现…

    python 2023年6月5日
    00
  • python 魔法函数实例及解析

    Python 魔法函数实例及解析 Python 中的魔法函数(Magic Function)是指以双下划线__开头和结尾的函数,例如__init__、__len__、__str__等。这些魔法函数可以让Python对象拥有上下文感知能力,并使对象的行为更像Python内置类型。Python 内部的实现也大量使用了魔法函数。在本篇文章中,我们将详细讲解 Pyt…

    python 2023年6月3日
    00
  • python中前缀运算符 *和 **的用法示例详解

    Python中前缀运算符和*的用法示例详解 在Python中,前缀运算符和*的用法非常灵活多样,能够简化代码编写、提高代码效率。具体用法如下: 前缀运算符* 前缀运算符*可用于函数调用时将序列或元组展开成位置参数,或将字典展开为关键字参数。例如: # 将序列展开成位置参数 nums = [1, 2, 3, 4] print(*nums) # 输出:1 2 3…

    python 2023年5月14日
    00
  • Python/MySQL实现Excel文件自动处理数据功能

    下面就为您详细讲解Python/MySQL实现Excel文件自动处理数据功能的完整实例教程。 确定需求 我们要实现的功能是读取Excel文件中的数据,将其存储到MySQL数据库中,并对数据进行统计分析。因此,需要用到xlrd和pymysql这两个Python库。 安装依赖库 在开始之前,需要确保已经安装了xlrd和pymysql这两个依赖库。可以通过下面的命…

    python 2023年5月13日
    00
  • Python多线程下载文件的方法

    关于“Python多线程下载文件的方法”的攻略,我可以给你提供一些详细的介绍和代码示例。首先,让我们来了解一下Python多线程的概念和基本用法。 多线程是指在同一应用程序中,同时有多个执行线程,而每个线程都运行在独立的堆栈空间中。线程并发的运行可以提高应用程序的性能。在Python中,可以通过threading模块进行多线程编程。下面是多线程下载文件的完整…

    python 2023年5月19日
    00
  • Python中if else的三种形式

    if else语句是编程中经常使用的一种条件语句,用于根据给定的条件执行不同的代码块。 在 Python 中,可以使用 if else 语句对条件进行判断,然后根据不同的结果执行不同的代码。 Python 中的 if else 语句可以细分为三种形式,分别是 单个if 语句、if else 语句和 if elif else 语句,这篇文章将详细介绍这三种条件…

    2023年2月15日
    00
  • uniapp,微信小程序中使用 MQTT的问题

    使用 MQTT 在 uniapp 和微信小程序中进行通信,需要使用到一个 MQTT 的客户端库。下面将为大家提供一份详细的攻略,以帮助读者解决这个问题。在本攻略中,我们选择使用基于 Paho MQTT 的客户端库,该库支持在多种平台和语言中使用。 1. 准备工作 在使用 MQTT 客户端库之前,需要先在项目中安装该库。我们以 uniapp 项目为例,在项目根…

    python 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部