吴恩达机器学习L1W3L06-逻辑回归的梯度下降

news2024/9/22 15:32:16

目标

在本实验室,你可以看到

  • 更新逻辑回归的梯度下降。
  • 在一个熟悉的数据集上探索梯度下降
import copy, math
import numpy as np
%matplotlib widget
import matplotlib.pyplot as plt
from lab_utils_common import  dlc, plot_data, plt_tumor_data, sigmoid, compute_cost_logistic
from plt_quad_logistic import plt_quad_logistic, plt_prob
plt.style.use('./deeplearning.mplstyle')

数据集

让我们从决策边界实验室中使用的相同的两个特征数据集开始。

X_train = np.array([[0.5, 1.5], [1,1], [1.5, 0.5], [3, 0.5], [2, 2], [1, 2.5]])
y_train = np.array([0, 0, 0, 1, 1, 1])

和前面一样,我们将使用一个辅助函数来绘制这些数据。标签为 y = 1 y=1 y=1的数据点显示为红色叉,而标签为 y = 0 y=0 y=0的数据点显示为蓝色圆。

fig,ax = plt.subplots(1,1,figsize=(4,4))
plot_data(X_train, y_train, ax)

ax.axis([0, 4, 0, 3.5])
ax.set_ylabel('$x_1$', fontsize=12)
ax.set_xlabel('$x_0$', fontsize=12)
plt.show()

逻辑回归的梯度下降

回想一下梯度下降算法利用了梯度计算:
在这里插入图片描述 repeat until convergence:    {        w j = w j − α ∂ J ( w , b ) ∂ w j    for j := 0..n-1            b = b − α ∂ J ( w , b ) ∂ b } \begin{align*} &\text{repeat until convergence:} \; \lbrace \\ & \; \; \;w_j = w_j - \alpha \frac{\partial J(\mathbf{w},b)}{\partial w_j} \tag{1} \; & \text{for j := 0..n-1} \\ & \; \; \; \; \;b = b - \alpha \frac{\partial J(\mathbf{w},b)}{\partial b} \\ &\rbrace \end{align*} repeat until convergence:{wj=wjαwjJ(w,b)b=bαbJ(w,b)}for j := 0..n-1(1)

其中每次迭代对所有 j j j同时执行 w j w_j wj的更新,
∂ J ( w , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x j ( i ) ∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) \begin{align*} \frac{\partial J(\mathbf{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\mathbf{w},b}(\mathbf{x}^{(i)}) - y^{(i)})x_{j}^{(i)} \tag{2} \\ \frac{\partial J(\mathbf{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\mathbf{w},b}(\mathbf{x}^{(i)}) - y^{(i)}) \tag{3} \end{align*} wjJ(w,b)bJ(w,b)=m1i=0m1(fw,b(x(i))y(i))xj(i)=m1i=0m1(fw,b(x(i))y(i))(2)(3)

  • M是数据集中训练样例的个数
  • f w , b ( x ( i ) ) f_{\mathbf{w},b}(x^{(i)}) fwb(x(i))是模型的预测,而 y ( i ) y^{(i)} y(i)是目标
  • 对于逻辑回归模型
    z = w ⋅ x + b z = \mathbf{w} \cdot \mathbf{x} + b z=wx+b
    f w , b ( x ) = g ( z ) f_{\mathbf{w},b}(x) = g(z) fw,b(x)=g(z)
    where g ( z ) g(z) g(z) is the sigmoid function:
    g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+ez1

梯度下降实现

梯度下降算法的实现有两个部分:

  • 实现上述公式(1)的循环。这是下面的gradient_descent,通常在可选和实践实验室中提供给您。
  • 流速梯度的计算,如式(2、3)所示。这是下面的compute_gradient_logistic。你将被要求完成本周的实践实验。

计算梯度,代码描述

对所有 w j w_j wj b b b实现上述式(2)、(3)。
有很多方法可以实现这一点。下面概述如下:

  • 初始化变量累加’ dj_dw ‘和’ dj_db ’

对于这些例子

  • 计算该示例的误差 g ( w ⋅ x ( i ) + b ) − y ( i ) g(\mathbf{w} \cdot \mathbf{x}^{(i)} + b) - \mathbf{y}^{(i)} g(wx(i)+b)y(i)
  • 对于本例中的每个输入值 x j ( i ) x_{j}^{(i)} xj(i)
    • 将错误值乘以输入的 x j ( i ) x_{j}^{(i)} xj(i),并加上’ dj_dw '的相应元素。(上式2)
  • 将错误添加到’ dj_db '(上面的公式3)
  • 用’ dj_db ‘和’ dj_dw '除以样本总数(m)
  • 注意, x ( i ) \mathbf{x}^{(i)} x(i)在numpy 或者 X[i,:]orX[i]和 x j ( i ) x_{j}^{(i)} xj(i) is `X[i,j]
def compute_gradient_logistic(X, y, w, b): 
    """
    Computes the gradient for linear regression 
 
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
    Returns
      dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w. 
      dj_db (scalar)      : The gradient of the cost w.r.t. the parameter b. 
    """
    m,n = X.shape
    dj_dw = np.zeros((n,))                           #(n,)
    dj_db = 0.

    for i in range(m):
        f_wb_i = sigmoid(np.dot(X[i],w) + b)          #(n,)(n,)=scalar
        err_i  = f_wb_i  - y[i]                       #scalar
        for j in range(n):
            dj_dw[j] = dj_dw[j] + err_i * X[i,j]      #scalar
        dj_db = dj_db + err_i
    dj_dw = dj_dw/m                                   #(n,)
    dj_db = dj_db/m                                   #scalar
        
    return dj_db, dj_dw  

使用下面的单元格检查梯度函数的实现。

X_tmp = np.array([[0.5, 1.5], [1,1], [1.5, 0.5], [3, 0.5], [2, 2], [1, 2.5]])
y_tmp = np.array([0, 0, 0, 1, 1, 1])
w_tmp = np.array([2.,3.])
b_tmp = 1.
dj_db_tmp, dj_dw_tmp = compute_gradient_logistic(X_tmp, y_tmp, w_tmp, b_tmp)
print(f"dj_db: {dj_db_tmp}" )
print(f"dj_dw: {dj_dw_tmp.tolist()}" )

预期结果

dj_db: 0.49861806546328574
dj_dw: [0.498333393278696, 0.49883942983996693]

梯度下降代码

实现上述方程(1)的代码如下所示。花点时间定位和比较例程中的函数与上面的方程。

def gradient_descent(X, y, w_in, b_in, alpha, num_iters): 
    """
    Performs batch gradient descent
    
    Args:
      X (ndarray (m,n)   : Data, m examples with n features
      y (ndarray (m,))   : target values
      w_in (ndarray (n,)): Initial values of model parameters  
      b_in (scalar)      : Initial values of model parameter
      alpha (float)      : Learning rate
      num_iters (scalar) : number of iterations to run gradient descent
      
    Returns:
      w (ndarray (n,))   : Updated values of parameters
      b (scalar)         : Updated value of parameter 
    """
    # An array to store cost J and w's at each iteration primarily for graphing later
    J_history = []
    w = copy.deepcopy(w_in)  #avoid modifying global w within function
    b = b_in
    
    for i in range(num_iters):
        # Calculate the gradient and update the parameters
        dj_db, dj_dw = compute_gradient_logistic(X, y, w, b)   

        # Update Parameters using w, b, alpha and gradient
        w = w - alpha * dj_dw               
        b = b - alpha * dj_db               
      
        # Save cost J at each iteration
        if i<100000:      # prevent resource exhaustion 
            J_history.append( compute_cost_logistic(X, y, w, b) )

        # Print cost every at intervals 10 times or as many iterations if < 10
        if i% math.ceil(num_iters / 10) == 0:
            print(f"Iteration {i:4d}: Cost {J_history[-1]}   ")
        
    return w, b, J_history         #return final w,b and J history for graphing

让我们对数据集运行梯度下降。

w_tmp  = np.zeros_like(X_train[0])
b_tmp  = 0.
alph = 0.1
iters = 10000

w_out, b_out, _ = gradient_descent(X_train, y_train, w_tmp, b_tmp, alph, iters) 
print(f"\nupdated parameters: w:{w_out}, b:{b_out}")

我们来绘制梯度下降的结果:

fig,ax = plt.subplots(1,1,figsize=(5,4))
# plot the probability 
plt_prob(ax, w_out, b_out)

# Plot the original data
ax.set_ylabel(r'$x_1$')
ax.set_xlabel(r'$x_0$')   
ax.axis([0, 4, 0, 3.5])
plot_data(X_train,y_train,ax)

# Plot the decision boundary
x0 = -b_out/w_out[1]
x1 = -b_out/w_out[0]
ax.plot([0,x0],[x1,0], c=dlc["dlblue"], lw=1)
plt.show()

在上图中:

  • 阴影反映了概率y=1(决策边界之前的结果)
  • 决策边界是概率= 0.5处的那条线

添加另外一组数据集

让我们回到单变量数据集。仅使用两个参数, w w w b b b,就可以使用等高线图来绘制成本函数,从而更好地了解梯度下降的情况。

x_train = np.array([0., 1, 2, 3, 4, 5])
y_train = np.array([0,  0, 0, 1, 1, 1])

和前面一样,我们将使用一个辅助函数来绘制这些数据。标签为 y = 1 y=1 y=1的数据点显示为红色叉,而标签为 y = 0 y=0 y=0的数据点显示为黑色圆。

fig,ax = plt.subplots(1,1,figsize=(4,3))
plt_tumor_data(x_train, y_train, ax)
plt.show()

在下面的图中,尝试:

  • 通过点击右上角的等高线图来改变 w w w b b b

    • 改变可能需要一两秒钟
    • 请注意左上角图中成本值的变化。
    • 注意,每个示例中的成本是通过损失累积的(垂直虚线)
    • 点击等高线图将重置模型以进行新的运行
  • 要重置绘图,请重新运行单元格

w_range = np.array([-1, 7])
b_range = np.array([1, -14])
quad = plt_quad_logistic( x_train, y_train, w_range, b_range )

祝贺

你已经

  • 考察了逻辑回归的梯度计算的公式和实现
  • 利用这些例程
    • 探索单个变量数据集
    • 探索一个双变量数据集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL注入实例(sqli-labs/less-3)

0、初始页面 1、确定闭合字符 确定为字符型注入 ?id1 and 11 ?id1 and 12 确定闭合字符为 ‘) ?id1 ?id1) 2、确定表的列数 确定查询表的列数为3 ?id1) order by 3 -- 3、确定回显位置 确定回显位置为第二列和第三列 ?id-1) union select 1,2,3 -- 4、爆库名 …

MySQL数据库——数据库基础

二、数据库基础 1.主流数据库 SQL Sever:微软的产品&#xff0c;.Net程序员的最爱&#xff0c;中大型项目。Oracle:甲骨文产品&#xff0c;适合大型项目&#xff0c;复杂的业务逻辑&#xff0c;并发一般来说不如MySQL。MySQL&#xff1a;世界上最受欢迎的数据库&#xff0c;属…

《Advanced RAG》-01-朴素RAG存在的问题

摘要 文章阐述了RAG技术如何通过整合外部知识源来提升大型语言模型&#xff08;LLM&#xff09;的性能&#xff0c;使其能够产生更精确、上下文感知的回应&#xff0c;并减少幻觉现象。 自2023年以来&#xff0c;RAG已成为基于LLM的系统中最流行的架构&#xff0c;许多产品依赖…

一文彻底搞懂Fine-tuning - 预训练和微调(Pre-training vs Fine-tuning)

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…

推荐算法学习记录2.2——kaggle数据集的动漫电影数据集推荐算法实践——基于内容的推荐算法、协同过滤推荐

1、基于内容的推荐&#xff1a; 这种方法根据项的相关信息&#xff08;如描述信息、标签等&#xff09;和用户对项的操作行为&#xff08;如评论、收藏、点赞等&#xff09;来构建推荐算法模型。它可以直接利用物品的内容特征进行推荐&#xff0c;适用于内容较为丰富的场景。‌…

VBA学习(22):动态显示日历

这是在ozgrid.com论坛上看到的一个贴子&#xff0c;很有意思&#xff0c;本来使用公式是可以很方便在工作表中实现日历显示的&#xff0c;但提问者因其需要&#xff0c;想使用VBA实现动态显示日历&#xff0c;即根据输入的年份和月份在工作表中显示日历。 下面是实现该效果的VB…

web、nginx

一、web基本概念和常识 ■ Web:为用户提供的一种在互联网上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。 ■ Web 服务为用户提供各种互联网服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。 ■ Web 应用开发也经过了几…

C#中计算矩阵(数学库下载和安装)

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次&#xff0c;点赞2次&#xff0c;收藏4次。这篇博客作为C#的基础系列&#xff0c;和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先…

如何解决C#字典的线程安全问题

前言 我们在上位机软件开发过程中经常需要使用字典这个数据结构&#xff0c;并且经常会在多线程环境中使用字典&#xff0c;如果使用常规的Dictionary就会出现各种异常&#xff0c;本文就是详细介绍如何在多线程环境中使用字典来解决线程安全问题。 1、非线程安全举例 Dictio…

文件搜索 36

删除文件 文件搜索 package File;import java.io.File;public class file3 {public static void main(String[] args) {search(new File("D :/"), "qq");}/*** 去目录搜索文件* param dir 目录* param filename 要搜索的文件名称*/public static void sear…

探索Prefect:Python自动化的终极武器

文章目录 探索Prefect&#xff1a;Python自动化的终极武器背景&#xff1a;自动化的呼唤Prefect&#xff1a;自动化的瑞士军刀安装Prefect&#xff1a;一键启动基础用法&#xff1a;Prefect的五招场景应用&#xff1a;Prefect的实战演练常见问题&#xff1a;Prefect的故障排除总…

字节一面面经

1.redis了解吗&#xff0c;是解决什么问题的&#xff0c;redis的应用&#xff1f; Redis 是一种基于内存的数据库&#xff0c;常用的数据结构有string、hash、list、set、zset这五种&#xff0c;对数据的读写操作都是在内存中完成。因此读写速度非常快&#xff0c;常用于缓存&…

IDEA的疑难杂症

注意idea版本是否与maven版本兼容 2019idea与maven3.6以上不兼容 IDEA无法启动 打开idea下载安装的目录&#xff1a;如&#xff1a;Idea\IntelliJ IDEA 2024.1\bin 在bin下面找到 打开在最后一行添加暂停 pause 之后双击运行idea.bat 提示找不到一个jar包&#xff0c;…

MyBatis 框架的两大缺点及解决方案

MyBatis 框架的两大缺点及解决方案 1. SQL 编写负担重1.1 缺点概述1.2 解决方案 2. 数据库移植性差2.1 缺点概述2.2 解决方案 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; MyBatis 作为一款广受欢迎的 Java 持久层框架&#xff0c;尽管其…

ssh 显示图形化界面 Error: Can‘t open display

在客户端&#xff08;你自己的电脑&#xff0c;不是服务器&#xff09;安装 VcXsrv 直接从 github 上下载 https://github.com/marchaesen/vcxsrv/releases&#xff0c;或者使用 winget 命令 winget install -i vcxsrv在服务器上 ~/.zshrc 中&#xff08;或 ~/.bashrc&#xf…

【ubuntu系统】在虚拟机内安装Ubuntu

Ubuntu系统装机 描述新装机后的常规配置&#xff0c; 虚拟机使用vbox terminal 打不开 CTRL ALT F3 进入命令行模式&#xff08;需要返回桌面时CTRL ALT F1&#xff09;root用户登入cd /etc/default vi locale LANG“en_US” 改成 LANG“en_US.UTF-8”保存修改后&…

YOLOV8替换Lion优化器

YOLOV8替换Lion优化器 1 优化器介绍博客 参考bilibili讲解视频 论文地址&#xff1a;https://arxiv.org/abs/2302.06675 代码地址&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py """PyTorch implementation of the Lion …

linux 上源码编译安装 PolarDB-X

PolarDB-X 简介 PolarDB-X 是一款面向超高并发、海量存储、复杂查询场景设计的云原生分布式数据库系统。其采用 Shared-nothing 与存储计算分离架构&#xff0c;支持水平扩展、分布式事务、混合负载等能力&#xff0c;具备企业级、云原生、高可用、高度兼容 MySQL 系统及生态等…

CTF-web基础 HTTP协议

基础 HTTPHypertext Transfer Protocol 超文本链接协议&#xff0c;他是无状态的&#xff08;每一次请求都是独立的&#xff09;&#xff0c;发出request发给服务器然后返回responce&#xff0c;现在的版本是1.1版本&#xff0c;默认端口80&#xff08;https是443&#xff09;…

ubuntu上安装HBase伪分布式-2024年08月04日

ubuntu上安装HBase伪分布式-2024年08月04日 1.HBase介绍2.HBase与Hadoop的关系3.安装前言4.下载及安装5.单机配置6.伪分布式配置 1.HBase介绍 HBase是一个开源的非关系型数据库&#xff0c;它基于Google的Bigtable设计&#xff0c;用于支持对大型数据集的实时读写访问。HBase有…