文章目录

  • 梯度下降法
  • 目标函数:软间隔SVM的目标函数
  • 第一种:使用误差最大样本做梯度下降
  • 第二种:随机选择一个样本做梯度下降
  • 第三种:使用全部样本做梯度
  • 第四种:min-batch随机梯度下降
  • 第五种:选择top K个误差最大的样本做梯度:
  • 第六种:数据归一化和步长自适应,略。

梯度下降法

梯度下降法是求解***无约束最优化问题***的最常见的手段之一。
所以前面提到的软间隔SVM里面转换为hingeloss之后就可以使用梯度下降法实现了。

目标函数:软间隔SVM的目标函数


对应的目标函数为:

单个样本的偏导:

针对上述目标函数,介绍一下几个梯度下降的实现,目的是加深对梯度下降的理解

第一种:使用误差最大样本做梯度下降

首先这种做法是耗时而且有问题的,找出误差最大的样本,需要预测全体样本,耗时,误差最大的样本一般情况下就是噪声,误人子弟。一般启发式算法不会针对单个样本来启发,使用群体来启发,比如某个属性来启发。

import numpy as npclass LinearSVM:def __init__(self):self._w = self._b = Nonedef fit(self, x, y, c=1, lr=0.01, epoch=10000):x, y = np.asarray(x, np.float32), np.asarray(y, np.float32)self._w = np.zeros(x.shape[1])self._b = 0.for _ in range(epoch):self._w *= 1 - lrerr = 1 - y * self.predict(x, True)# 选取误差最大的样本用来更新权值idx = np.argmax(err)# 注意即使所有 x, y 都满足 w·x + b >= 1# 由于损失里面有一个 w 的模长平方# 所以仍然不能终止训练,只能截断当前的梯度下降if err[idx] <= 0:continuedelta = lr * c * y[idx]self._w += delta * x[idx]self._b += deltadef predict(self, x, raw=False):x = np.asarray(x, np.float32)y_pred = x.dot(self._w) + self._bif raw:return y_predreturn np.sign(y_pred).astype(np.float32)

第二种:随机选择一个样本做梯度下降

class LinearSVM_random_one(LinearSVM):def fit(self, x, y, c=1, lr=0.01, epoch=10000):x, y = np.asarray(x, np.float32), np.asarray(y, np.float32)self._w = np.zeros(x.shape[1])self._b = 0.for _ in range(epoch):self._w *= 1 - lr# 随机选取 1 个样本batch = np.random.choice(len(x), 1)x_batch, y_batch = x[batch], y[batch]err = 1 - y_batch * self.predict(x_batch, True)# 正确样本,直接再挑选样本if err <= 0:continue# 错误样本,做梯度delta = lr * c * y_batchself._w += delta * x_batchself._b += delta

第三种:使用全部样本做梯度

class LinearSVM_all(LinearSVM):def fit(self, x, y, c=1, lr=0.01, epoch=10000):x, y = np.asarray(x, np.float32), np.asarray(y, np.float32)self._w = np.zeros(x.shape[1])self._b = 0.for _ in range(epoch):self._w *= 1 - lr# 直接使用全部样本err = 1 - x * self.predict(y, True)if np.max(err) <= 0:continue# err<0的样本对梯度没作用因为误差为0mask = err > 0delta = lr * c * y[mask]self._w += np.mean(delta[..., None] * y[mask], axis=0)self._b += np.mean(delta)

第四种:min-batch随机梯度下降

class LinearSVM_minBatch(LinearSVM):def fit(self, x, y, c=1, lr=0.01, batch_size=128, epoch=10000):x, y = np.asarray(x, np.float32), np.asarray(y, np.float32)batch_size = min(batch_size, len(y))self._w = np.zeros(x.shape[1])self._b = 0.for _ in range(epoch):self._w *= 1 - lr# 随机选取 batch_size 个样本batch = np.random.choice(len(x), batch_size)x_batch, y_batch = x[batch], y[batch]err = 1 - y_batch * self.predict(x_batch, True)if np.max(err) <= 0:continuemask = err > 0delta = lr * c * y_batch[mask]self._w += np.mean(delta[..., None] * x_batch[mask], axis=0)self._b += np.mean(delta)

第五种:选择top K个误差最大的样本做梯度:

启发式选择,又避免了噪点,但是有一点就是耗时,不见得比minBatch好多少。

class LinearSVM_topK(LinearSVM):    # 用参数 batch_size 表示 Top n 中的 ndef fit(self, x, y, c=1, lr=0.01, topk=128, epoch=10000):x, y = np.asarray(x, np.float32), np.asarray(y, np.float32)# 如果 batch_size 设得比样本总数还多、则将其改为样本总数topk = min(topk, len(y))self._w = np.zeros(x.shape[1])self._b = 0.for _ in range(epoch):self._w *= 1 - lrerr = 1 - y * self.predict(x, True)# 利用 argsort 函数直接取出 Top n# 注意 argsort 的结果是从小到大的,所以要用 [::-1] 把结果翻转一下batch = np.argsort(err)[-topk:][::-1]err = err[batch]if err[0] <= 0:continue# 注意这里我们只能利用误分类的样本做梯度下降# 因为被正确分类的样本处、这一部分的梯度为 0mask = err > 0batch = batch[mask]# 取各梯度平均并做一步梯度下降delta = lr * c * y[batch]self._w += np.mean(delta[..., None] * x[batch], axis=0)self._b += np.mean(delta)

第六种:数据归一化和步长自适应,略。

机器学习:梯度下降法,几种实现策略相关推荐

  1. 人工智能与机器学习-梯度下降法

    人工智能与机器学习-梯度下降法 一.梯度下降法概述 梯度下降法(Gradient descent)是一个一阶最优化算法. 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近 ...

  2. 机器学习梯度下降法应用波士顿房价预测

    目录 1 线性回归api介绍 小结 2 波士顿房价预测 2.1 案例背景介绍 2.2 案例分析 2.3 回归性能评估 2.4 代码实现 2.4.1 正规方程 2.4.2 梯度下降法 2.5 小结 1 ...

  3. 机器学习梯度下降法举例

    本文是参考Andrew Ng网上课程和别人总结的机器学习笔记,作为笔者学习的参考,笔者主要实现了一些程序问题. 持续更新中- 更新- 先以最为简单的例子举例,比如有一个函数为y=x2y=x^2y=x2 ...

  4. 机器学习中的常见问题——几种梯度下降法

    一.梯度下降法 在机器学习算法中,对于很多监督学习模型,需要对原始的模型构建损失函数 l l l,接下来便是通过优化算法对损失函数 l l l进行优化,以便寻找到最优的参数 θ \theta θ.在求 ...

  5. python机器学习:梯度下降法

    ---<从机器学习到深度学习>刘长龙 用梯度下降法求解因变量最低点步骤: 任取一点为起始点 查看在当前点向哪个方向移动能得到最小的z值,并向该方向移动 重复该步骤,直到无法找到更小的z值, ...

  6. 机器学习入门(09)— 偏导数、梯度概念、梯度下降法理论和实现

    1. 偏导数概念 对于式 4-6 而言 式(4.6)有两个变量,求导数时有必要区分对哪个变量求导数,即对 x0 和 x1 两个变量中的哪一个求导数.另外,我们把这里讨论的有多个变量的函数的导数称为偏导 ...

  7. 机器学习最常用的优化算法 — 梯度下降法

    1. 学习目标 每一个机器学习模型都有一个目标函数,而学习的目标,就是最小化目标函数.直观而言,当我们已经获得了一个函数,最小化该函数其实就是,在其自变量取值范围内,找到使得因变量最小的那个自变量取值 ...

  8. 机器学习中的梯度下降法

    1. 机器学习中为什么需要梯度下降 梯度下降是机器学习中常见优化算法之一,梯度下降法有以下几个作用: (1)梯度下降是迭代法的一种,可以用于求解最小二乘问题. (2)在求解机器学习算法的模型参数,即无 ...

  9. [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD

    来源:信息网络工程研究中心本文约1100字,建议阅读5分钟 本文为你介绍常用的梯度下降法还具体包含有三种不同的形式. 1. 批量梯度下降法BGD 2. 随机梯度下降法SGD 3. 小批量梯度下降法MB ...

最新文章

  1. 自带数据线的迷你数显充电宝,旅途必备
  2. gif透明背景动画_前端基础系列之bmp、jpg、png、gif、svg常用图片格式浅谈(二)...
  3. 程序员如何用Java排序
  4. 强一致性和弱一致性的区别
  5. 为什么女人喜欢有钱的男人?
  6. 存储引擎和Mysql服务层出现索引信息不一致错误提示
  7. kotlin协程_Kotlin协程
  8. 通过HTTP协议发送远程消息
  9. python3.4教程_Python基础教程3.4 字符串方法
  10. 文本域换行 php,js获取textarea文本域自动换行符
  11. 云主机安装redis
  12. 全球范围内12个典型区域提取(total runoff)
  13. Gitbook 插件安装 - 导航目录折叠 chapter-fold
  14. postgresql_internals-14 学习笔记(二)常规vacuum
  15. [附源码]SSM计算机毕业设计动物保护网站JAVA
  16. dx12 龙书第九章学习笔记 -- 纹理贴图
  17. jsp成绩分析管理系统myeclipse编程java语言sqlserver数据库
  18. 201671030119唐盖强 实验三作业互评与改进报告
  19. Python——控制窗体的显示和隐藏以及位置和大小
  20. 【码云周刊第 65 期】5个前端 UI 优秀框架

热门文章

  1. float相乘后的类型_Psychopy | 第1期:数据类型及运算符
  2. 移动webhead参数
  3. html css记忆表,a的伪标签-css
  4. centos mysql php tomcat_centos 一键部署安装nginx,mysql,php,apache,tomcat,redis等包合集
  5. python float字节数_float型的数在内存中的表示 附:python3解析函数 | 学步园
  6. 【cmd】windows cmd 中判断命令执行成功
  7. 启动 docker 容器报错 (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0
  8. GSON反序列化时,字符串被转换成科学记数法的问题处理
  9. mysql+phpMyAdmin错误解决:bug #4813 MySQL 5.7.6 and the Users menu tab
  10. google套件_Google 推出 3 款语音识别应用,想用 AI 帮语言障碍者说话