python sklearn 梯度下降法_【机器学习】梯度下降法(Gradient descent)

2023-11-19

说明:以下内容为学习刘建平老师的博客所做的笔记

梯度下降(Gradient Descent)小结​www.cnblogs.com

因为个人比较喜欢知乎文章的编辑方式,就在这里边记笔记边学习,喜欢这个博客的朋友,可以去刘建平老师的博客follow,老师的github链接:

ljpzzz/machinelearning​github.com

梯度下降法是与最小二乘法并驾齐驱的一种无约束优化问题方法,在机器学习求解模型参数中常常会用到。

一、什么是梯度以及梯度的意义?

在微积分中,对多元函数的参数求偏导,把求导后的结果(各个参数的偏导数)以向量的形式表达出来就是梯度。比如

分别对
求偏导,得出的
就是梯度。如果是涉及三个参数的函数,那么
就是梯度。可以看看这个视频加深以下对梯度的感性认识:
https://www.bilibili.com/video/av19844108?from=search&seid=6984522082653211203​www.bilibili.com

那么梯度的意义又是什么?从几何的角度,梯度就是在这一点函数增加最快的方向,反之梯度的相反方向就是函数减小最快的方向。例如对于

点,-
的方向就是
减小最快的方向。

这里举一个爬山的例子:

比如我们在爬一座山,我们现在在初始点所标注的位置,现在想要尽快下山,应该用什么样的方式呢?我们需要朝着初始点的梯度负方向前进一步,然后在在新的初始点位置继续向梯度负方向前进一步,就这样一步又一步,我们可能会达到一个局部的山峰最低处。如果这个山峰是凸函数形状的,我们这样一步又一步地走下去,可能会走到山脚。

二、梯度下降的相关概念

步长:步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

特征:样本的输入部分,如

其中,
就是样本的输入部分,而
就是样本输出部分。

假设函数:在监督学习中,为了拟合输入的样本,而建立的拟合函数

,如对于m个样本
,有假设函数

损失函数:为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本

,采用线性回归,损失函数为:

三、梯度下降法实现过程(代数法)

1.先决条件:确定假设函数和损失函数

对于线性回归函数,我们设假设函数为

这里为了方便运算,我们设

=1,则以上式子可以简化为:
,那么可以推出该预测函数的苏是函数为(为了方便求导,将分母化为2m):

2.算法过程:

1)确定损失函数的梯度,对于

其梯度表达式为:
;

2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即

3)确定是否所有的

,梯度下降的距离都小于
,如果小于
则算法终止,当前所有的
(i=0,1,...n)即为最终结果。否则进入步骤4;

4)更新所有的,对于

,其更新表达式如下。更新完毕后继续转入步骤1。

5)对于线性回归预测函数,如下演示:

求偏导得到:

而步骤四对应的公式为:

这里的

可以用某个常数来表示。

三、梯度下降法的调优

在使用梯度下降时,需要进行调优。哪些地方需要调优呢?

1. 算法的步长选择。在前面的算法描述中,提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。

2. 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。

3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化。

先写到这里吧,后面继续更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python sklearn 梯度下降法_【机器学习】梯度下降法(Gradient descent) 的相关文章

  • yolo v3 fatal : Memory allocation failure

    torch版的 yolov3报错 fatal Memory allocation failure parser add argument n cpu type int default 8 help number of cpu threads
  • 蚂蚁笔记私有部署

    说明 其实官方的教程中已经写得很清楚了 我写这个主要是为了记录一下我自己当时安装的过程 方便后续查询 官方文档请查阅 https github com leanote leanote wiki 环境要求 CentOS6 5 Nginx Mo
  • (原理及配置)nginx配置负载均衡

    背景介绍 早期的网站流量和业务功能都比较简单 单台服务器就可以满足基本需求 但是随着互联网的发展 业务流量越来越大并且业务逻辑也越来越复杂 单台服务器的性能及单点故障问题就凸显出来了 因此需要多台服务器组成应用集群 进行性能的水平扩展以及避
  • 一台电脑双 GitHub 账户配置,同时两个 SSH 密钥

    前言 本人搞了两个 GitHub 账号 一个用来正常的和别人合作项目 另一个用来自己写一些代码 希望能做到两个本地账户和远程账号都完全隔离 没有联系 也不会被混淆使用 但是这样就会有一个问题 设置本地用户 user email 时候 如果两
  • 嵌入式物联网协议--MQTT

    本文使用MQTT 3 1 1版本 目录 一 MQTT简介 1 什么是MQTT 2 MQTT本质 3 MQTT报文类型 4 MQTT Qos质量 二 14个报文详解 1 CONNECT报文 1 C gt S 固定报头 可变报头 负载 1 固定
  • 爬朋友圈好友的个性签名,生成云图(上)

    看了大神的http mp weixin qq com s biz MzIxNjA2ODUzNg mid 2651436390 idx 1 sn 0ec8030efc28b36c2924e7f02a4462f2 chksm 8c73adb1b
  • 请求的站点不可用或找不到_100个好用的生活小妙招,不收好,要用时就找不到!...

    阅读本文前 请您先点击上面的蓝色字体 秘密基地 再点击 关注 这样您就可以继续免费收到最新文章了 每天都有好看的图文 视频 秘密基地与你共赏 生活是一门学问 如果你能学着 偷懒 也许会变得更有乐趣 今天 为大家整理了100条实用的生活小妙招
  • 单片机晶振和波特率的关系

    在串行通信中 MCS 51串口可约定四种工作方式 其中 方式0和方式2的波特率是固定的 而方式1和方式3的波特率是可变的 由定时器T1的溢出率决定 波特率是指串行端口每秒内可以传输的波特位数 这里所指的波特率 如标准9600不是每秒种可以传
  • 苹果iPhone一键解锁破解流程(新机篇)

    网上详细流程已经很多了 建议破解之前都看一下 我这边说的就是要注意的几个地方 这几天我都泡在网上 感觉基本都会了 今天拿到机子 还是弄了3个小时 基本流程 1 拿到新机以后 首先要破解才能进入系统 如果不能进入系统 itunne不能更新到1
  • kafka配置内外网访问

    listeners 学名叫监听器 其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务 advertised listeners 和 listeners 相比多了个 advertised Advertised 的
  • linux的aux命令,Linux中 ps aux 命令

    ps aux USER PID CPU MEM VSZ RSS TT STAT STARTED TIME COMMAND root 11 100 0 0 0 0 16 RL 4Dec09 98403 03 48 idle cpu root
  • 如何将git项目转移给其他人

    为什么80 的码农都做不了架构师 gt gt gt 方法很简单 成员管理里将要转给项目的人设置为master 权限 然后他再登录系统将你移除项目就实现了项目转移 转载于 https my oschina net zhaky blog 907
  • 【Three.js】第十六章 Shadows 阴影

    16 Shadows 阴影 介绍 上节课我们学会了灯光 现在我们需要阴影 物体的背面应该在黑暗中 这就是阴影所谓的核心 我们缺少的是物体对象的投影 也就是根据被投影的对象在其他对象身上创建阴影 阴影渲染一直是实时 3D 渲染的一大挑战 开发
  • go 学习 之 GORM数据插入,查询,修改,删除

    GORM插入数据 gorm新增记录 定义一个用户 并初始化数据 u User Username tizi365 Password 123456 CreateTime time Now Unix 插入一条用户数据 下面代码会自动生成SQL语句
  • TCP快速重传机制

    一 快速重传机制 上一篇讲到了TCP 的超时重传 但是超时重传往往会带来许多微妙的问题 比如说 当一个报文段丢失时 会等待一定的超时周期然后才重传分组 增加了端到端的时延 当一个报文段丢失时 在其等待超时的过程中 可能会出现这种情况 其后的
  • 清空v4l2 usbcamera缓存

    做过usbcamera的同学们应该都知道 usbcamera有一个缓存队列 当应用上面调用startPreview的时候 就会层层的调到usbcamera 的ioctl mFd VIDIOC DQBUF tmp buf 用于从队列里出去一个
  • Qt C++ map使用const初始化 QMap使用const初始化

    QMap怎么使用const初始化 有的时候 需要通过字符串去访问一些固定的参数 class A 男生11人 女生10人 教室面积150平 class B 男生11人 女生11人 教室面积155平 当然可以使用枚举加数组的方式 但是就是想用m
  • Kafka入门基础知识学习笔记-Kafka只是消息引擎吗

    学习极客时间 Kafka核心技术与实战 入门 03 05 作者 胡夕 Apache Kafka 的一名代码贡献者 目前在社区的 Patch 提交总数位列第 22 位 应该说算是国内比较活跃的贡献者了 胡夕老师 赠言 聪明人也要下死功夫 最近

随机推荐