Python机器学习之随机梯度下降法的实现

yizhihongxing

Python机器学习之随机梯度下降法的实现

在机器学习中,拟合函数常常通过优化算法来实现。梯度下降法是一种最常见的优化算法,其具有简单、易于实现等特点。随机梯度下降法(Stochastic Gradient Descent, SGD)则是梯度下降法的一种变体,其通常比标准梯度下降法具有更低的时间复杂度和更快的速度。

本文将介绍随机梯度下降法的实现过程,包括概念的介绍、损失函数的定义、参数的初始化、迭代更新的方法等。在此基础上,我们将通过两个示例来演示如何使用Python实现随机梯度下降法。

随机梯度下降法概述

随机梯度下降法是一种基于随机样本的梯度下降法。与标准梯度下降法的区别在于,随机梯度下降法每次只随机选择一个样本进行迭代,并且通过这个样本来更新模型参数。相较于标准梯度下降法,随机梯度下降法可以加速模型的训练,因为每次只需要计算单个样本的梯度,而不是整个样本集。

随机梯度下降法的损失函数

对于一个二分类问题,我们通常使用逻辑回归模型来拟合。损失函数为:

$$
J(w) = \frac{1}{m} \sum_{i=1}^{m}[-y^{(i)} log(h_w(x^{(i)})) - (1 - y^{(i)}) log(1 - h_w(x^{(i)}))]
$$

其中,$w$是参数,$y^{(i)}$是第$i$个标签,$x^{(i)}$是第$i$个样本,$h_w(x^{(i)})$是逻辑回归模型预测出的概率值。

随机梯度下降法的参数初始化

我们需要初始化模型参数,其中偏移量$b$初始化为0,权重$w$则使用正态分布随机初始化:

import numpy as np

def initialize_params(dim):
    w = np.random.randn(dim, 1)
    b = 0
    return w, b

随机梯度下降法的迭代更新

我们需要使用随机样本来每次更新模型参数,具体操作如下:

  1. 从样本集中随机选取一个样本$x^{(i)}$和一个标签$y^{(i)}$;
  2. 将样本$x^{(i)}$代入$J(w)$和梯度$dw$中,计算出代价和梯度值;
  3. 使用学习率$\alpha$来更新模型参数:$w = w - \alpha dw$,$b = b - \alpha db$;
  4. 重复步骤1-3,直到达到最大迭代次数或者达到收敛。
def sgd(X, y, w, b, alpha, num_iterations, tol):
    costs = []
    for i in range(num_iterations):
        # 选择一个样本
        j = np.random.randint(0, X.shape[0])

        # 计算代价和梯度
        z = np.dot(X[j], w) + b
        a = 1 / (1 + np.exp(-z))
        cost = - y[j] * np.log(a) - (1 - y[j]) * np.log(1 - a)
        dw = X[j].reshape(-1, 1) * (a - y[j])
        db = a - y[j]

        # 更新参数
        w -= alpha * dw
        b -= alpha * db

        # 记录代价
        if i % 100 == 0:
            costs.append(cost)

        # 检查收敛
        if len(costs) > 1 and np.abs(costs[-1] - costs[-2]) < tol:
            break

    return w, b, costs

示例一:Iris数据集上的二分类

为了演示随机梯度下降法的实现,我们将使用Iris数据集上的二分类问题。在这个问题中,我们需要预测Iris花的类别,其中有两个类别:Iris Setosa和Iris Versicolour。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
iris = load_iris()
X = iris.data[:100, :2]
y = iris.target[:100]

# 将标签转换为0和1
y[y == 0] = 1
y[y == 1] = 0

# 划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化参数
w, b = initialize_params(X_train.shape[-1])

# 运行随机梯度下降法
alpha = 0.1
num_iterations = 5000
tol = 1e-5
w, b, costs = sgd(X_train, y_train, w, b, alpha, num_iterations, tol)

预测结果可以通过计算准确率来评估:

# 预测
def predict(X, w, b):
    z = np.dot(X, w) + b
    a = 1 / (1 + np.exp(-z))
    y_pred = np.round(a)
    return y_pred

# 计算准确率
y_pred = predict(X_test, w, b)
accuracy = np.sum(y_pred == y_test) / len(y_test)
print(f"Accuracy: {accuracy:.2f}")

最终输出的准确率为0.97左右,说明随机梯度下降法已经很好地拟合了这个二分类问题。

示例二:波士顿房价数据集上的回归

除了分类问题,随机梯度下降法同样适用于回归问题。我们将使用波士顿房价数据集作为示例,这是一个标准的回归问题,其中需要预测房价价格。

from sklearn.datasets import load_boston

# 加载数据
boston = load_boston()
X = boston.data
y = boston.target.reshape(-1, 1)

# 划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化参数
w, b = initialize_params(X_train.shape[-1])

# 运行随机梯度下降法
alpha = 0.0001
num_iterations = 10000
tol = 1e-5
w, b, costs = sgd(X_train, y_train, w, b, alpha, num_iterations, tol)

预测结果可以通过计算均方误差(Mean Squared Error, MSE)来评估:

# 预测
def predict(X, w, b):
    y_pred = np.dot(X, w) + b
    return y_pred

# 计算MSE
y_pred = predict(X_test, w, b)
mse = np.mean(np.square(y_pred - y_test))
print(f"Mean Squared Error: {mse:.2f}")

最终输出的MSE为25.26左右,说明随机梯度下降法已经很好地拟合了这个回归问题。

总结

本文介绍了随机梯度下降法的实现过程,包括概念的介绍、损失函数的定义、参数的初始化、迭代更新的方法等。我们通过两个示例演示了如何使用Python实现随机梯度下降法,在分类和回归问题中都取得了不错的结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python机器学习之随机梯度下降法的实现 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • pandas针对excel处理的实现

    下面我将为你详细讲解“pandas针对excel处理的实现”的完整实例教程,包含两条示例说明。 1. 安装pandas 在使用pandas之前,你需要先安装它。可以使用下面的命令在命令行中安装pandas: pip install pandas 2. 读取Excel文件 在使用pandas读取Excel文件之前,需要导入pandas库并指定Excel文件的路…

    python 2023年5月13日
    00
  • python暴力解压rar加密文件过程详解

    Python暴力解压RAR加密文件过程详解 前言 RAR文件格式是一种常见的压缩文件格式,可以在Windows中的WinRAR等软件中打开和解压。但是,如果RAR文件被加密了,我们就需要密码才能解压。如果你忘记了密码,或者想通过程序暴力破解,那么这篇文章就是为你准备的。 解压RAR加密文件的原理 RAR文件加密采用的是经典的AES加密算法,密码通常为ASCI…

    python 2023年6月3日
    00
  • 在Python中使用CasperJS获取JS渲染生成的HTML内容的教程

    CasperJS是一个基于PhantomJS的JavaScript测试工具,可以模拟用户行为,获取JS渲染生成的HTML内容。Python提供了多种与CasperJS集成的方法,包括使用subprocess和pycasper等。以下是详细讲解在Python中使用CasperJS获取JS渲染生成的HTML内容的攻略,包含两个示例。 示例1:使用subproce…

    python 2023年5月15日
    00
  • Python使用random模块实现掷骰子游戏的示例代码

    下面是关于Python使用random模块实现掷骰子游戏的攻略: 1. 简介 掷骰子是一种非常古老的娱乐方式,可以用来随机生成不同的结果。在程序中,我们可以使用Python中的random模块来模拟掷骰子的操作,生成随机的数字。 2. 示例代码 下面是演示如何使用Python的random模块实现掷骰子游戏的代码示例: import random # 定义掷…

    python 2023年6月3日
    00
  • python实现360的字符显示界面

    一、Python实现360字符显示界面 Python可以通过curses库来实现字符显示界面,其中curses库提供了在终端中操作文本界面的函数接口。接下来我们详细讲解如何使用Python的curses库来实现360的字符显示界面。 1.安装curses库: 在Windows系统下,可以使用pip来安装curses库: pip install windows…

    python 2023年5月20日
    00
  • Python的字符串操作简单实例

    Python字符串操作简单实例 Python作为一种强大的编程语言,有着很多字符串操作的方法。在本文中,我们会介绍一些常用的字符串操作示例,包括字符串定义、截取字符串、拼接字符串、字符串格式化等。 字符串定义 Python中的字符串可以通过单引号、双引号或三引号来定义,其中三引号可以定义多行字符串。示例如下: str1 = ‘hello world’ # 使…

    python 2023年5月30日
    00
  • 利用python实现汉字转拼音的2种方法

    关于“利用Python实现汉字转拼音的2种方法”这个话题,以下是我准备的详细攻略。 1. 什么是汉字转拼音 汉字转拼音即将汉字转化为拼音。在很多应用场景下,我们需要将输入的汉字转换成对应的拼音,方便进行后续处理和分析。下面介绍两种常用的汉字转拼音方法。 2. 利用pypinyin实现汉字转拼音 pypinyin是一个简单易用的Python库,可以方便地将汉字…

    python 2023年5月20日
    00
  • 移除切比雪夫多项式小拖尾系数的Python程序

    移除切比雪夫多项式小拖尾系数的过程,通常被称为切比雪夫多项式带通滤波。这个过程可以通过一系列的数学公式和操作完成。在Python中,我们可以用一些库和函数来实现这个过程。以下是一种比较完整的Python程序,它可以用来移除切比雪夫多项式小拖尾系数: 导入所需库 import scipy.signal as signalimport numpy as np 配…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部