最小二乘法的原理及实现

1.最小二乘法的原理及实现

笔记来源于《白话机器学习的数学》

1.1 最小二乘法的原理

预测一个变量 x x x与一个变量 y y y的关系
例如:广告费 x x x与点击量 y y y
用直线拟合数据

1.2 最小二乘法的实现

广告费x和点击量y,找到一条直线表达式,输入广告费来预测点击量
训练数据如下:

import numpy as np
import matplotlib.pyplot as plt# 读入训练数据
train = np.loadtxt('click.csv', delimiter=',', dtype='int', skiprows=1)
train_x = train[:,0]
train_y = train[:,1]

数据预处理步骤之一:对训练数据进行标准化 / 归一化,目的使得参数收敛会更快
计算出数据中所有x的均值 μ \mu μ和标准差 σ \sigma σ,每个数值x按照下列式子进行标准化,数据y也进行类似标准化

# 标准化
mu = train_x.mean()
sigma = train_x.std()
def standardize(x):return (x - mu) / sigmatrain_z = standardize(train_x)
# 展示标准化后的数据
plt.plot(train_z, train_y, 'o')
plt.show()

横轴范围变为了[-2,2]

假设函数 f θ ( x ) f_{\theta}(x) fθ(x)、目标函数 E ( θ ) E(\theta) E(θ)

# 参数初始化
theta0 = np.random.rand()
theta1 = np.random.rand()
# 预测函数
def f(x):return theta0 + theta1 * x
# 目标函数
def E(x, y):return 0.5 * np.sum((y - f(x)) ** 2)
# 学习率
ETA = 1e-3
# 初始化误差的差值,作为循环结束依据
diff = 1
# 初始化更新次数
count = 0

梯度下降法对目标函数进行优化
参数更新表达式

# 直到误差的差值小于 0.01 为止,重复参数更新
error = E(train_z, train_y)
while diff > 1e-2:# 更新结果保存到临时变量tmp_theta0 = theta0 - ETA * np.sum((f(train_z) - train_y))tmp_theta1 = theta1 - ETA * np.sum((f(train_z) - train_y) * train_z)# 更新参数theta0 = tmp_theta0theta1 = tmp_theta1# 计算与上一次误差的差值current_error = E(train_z, train_y)diff = error - current_errorerror = current_error# 输出日志count += 1log = '第 {} 次 : theta0 = {:.3f}, theta1 = {:.3f}, 差值 = {:.4f}'print(log.format(count, theta0, theta1, diff))

# 绘图确认
x = np.linspace(-3, 3, 100)
plt.plot(train_z, train_y, 'o')
plt.plot(x, f(x))
plt.show()

对目标函数的优化方法:
最速下降法(梯度下降法/Gradient Descent) 对所有训练数据都重复进行计算
梯度下降法的问题是训练数据越多,循环次数越多,计算时间越长,选用随机数作为初始值,每次初始值都会变,进而导致陷入局部最优解的问题

在GD算法中,每次的梯度都是从所有样本中累计获取的,这种情况最容易导致梯度方向过于稳定一致,且更新次数过少,容易陷入局部最优–摘自:防止梯度下降陷入局部最优的三种方法


随机梯度下降法(Stochastic GD)随机选择一个训练数据,并使用它来更新参数
k是被随机选中的数据索引
θ j : = θ j − η ( f θ ( x ( k ) ) − y ( k ) ) x j ( k ) \theta_j:=\theta_j-\eta\big(f_{\boldsymbol{\theta}}(\boldsymbol{x}^{(k)})-y^{(k)}\big)x_j^{(k)} θj:=θjη(fθ(x(k))y(k))xj(k)
注意这里没有求和,因为只使用了一个训练数据
为什么随机梯度下降法不容易陷入局部最优?

stochastic GD是GD的另一种极端更新方式,其每次都只使用一个样本进行参数更新,这样更新次数大大增加,更新参数时使用的又是选择数据时的梯度,每次梯度方向不同,也就不容易陷入局部最优。–摘自:防止梯度下降陷入局部最优的三种方法

小批量梯度下降法(Mini-Batch GD)随机选择m个训练数据来更新参数
θ j : = θ j − η ∑ k ∈ K ( f θ ( x ( k ) ) − y ( k ) ) x j ( k ) \theta_j:=\theta_j-\eta\sum_{k\in K}\big(f_{\boldsymbol{\theta}}(\boldsymbol{x}^{(k)})-y^{(k)}\big)x_j^{(k)} θj:=θjηkK(fθ(x(k))y(k))xj(k)
∑ k ∈ K \sum_{k\in K} kK代表将集合K中的所有元素相加

Mini-Batch GD便是两种极端的折中,即每次更新使用一小批样本进行参数更新。Mini-Batch GD是目前最常用的优化算法,严格意义上Mini-Batch GD也叫做stochastic GD,所以很多深度学习框架上都叫做SGD。–摘自:防止梯度下降陷入局部最优的三种方法

动量(Momentum)

动量也是GD中常用的方式之一,SGD的更新方式虽然有效,但每次只依赖于当前批样本的梯度方向,这样的梯度方向依然很可能很随机。动量就是用来减少随机,增加稳定性。其思想是模仿物理学的动量方式,每次更新前加入部分上一次的梯度量,这样整个梯度方向就不容易过于随机。一些常见情况时,如上次梯度过大,导致进入局部最小点时,下一次更新能很容易借助上次的大梯度跳出局部最小点。–摘自:防止梯度下降陷入局部最优的三种方法

无论使用哪种优化方法对目标函数进行优化,我们都必须考虑学习率 η \eta η设置为合适的值很重要,这个问题比较难,可以通过反复尝试来找到合适的值

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据表查询

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:进入MySQL知识专…

每天一点Python——day43

#第四十三天字典的视图操作: ①keys()获取字典中所有的键 ②values()获取字典中所有的值 ③items()获取字典中所有的键值对#如图: #例:获取所有的键 a{哥哥:18,妹妹:16,姐姐:17}#字典创立 ba.keys()#获取后我们存在变量b中,右边的…

Vision Pro中VR游戏空间边界为3×3米圆形

6月25日青亭网报道,此前我们已经报道了苹果visionOS有三种应用类型:FullSpaces、Windows、Volume。其中FullSpaces是仅显示一款应用的类型,后两种为共享空间可多窗口、多应用显示。 在FullSpaces模式下,苹果的一份文档显示visionO…

Linux下 MHA故障切换 主从角色提升

目录 所有主机共同操作 manger操作 其他四台安装 搭建主从复制环境 nobe slave1 配置 slave2 slave3 配置 配置MHA环境 简述MHA: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由…

深入理解深度学习——Transformer:编码器(Encoder)部分

分类目录:《深入理解深度学习》总目录 相关文章: 注意力机制(AttentionMechanism):基础知识 注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(下篇)

深入探索Logback日志框架的原理分析和开发实战技术指南&#xff08;下篇&#xff09; 根节点configuration包含的属性基本参数详解子节点介绍设置上下文名称<contextName>使用案例 设置变量属性值<property>获取时间戳字符串<timestamp>设置loggerroot根节点…

Jenkins 发送文件到远程服务器:Publish Over SSH 插件

Jenkins 发送文件到远程服务器&#xff1a;Publish Over SSH 插件 文章目录 Jenkins 发送文件到远程服务器&#xff1a;Publish Over SSH 插件一、Publish Over SSH 插件1、概述2、主要功能和特点3、插件主页4、安装 Publish Over SSH 插件5、配置远程主机 二、发送文件到远程主…

文本向量化

文章目录 文本的tokenization向量化1.one-hot编码2.word embedding3.API 文本的tokenization tokenization就是通常说的分词&#xff0c;分出的每一个词我们把它称为token。 常见的分词工具有很多&#xff0c;比如&#xff1a; jieba分词清华大学的分词工具THULAC 中文分词…

java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

消息队列使用场景介绍

消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题 实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构 使用较多的消息队列有ActiveMQ&#xff0c;RabbitMQ&#xff0c;ZeroMQ&#xff0c;K…

【SpringCloud——Elasticsearch(下)】

一、数据聚合 聚合&#xff0c;可以实现对文档数据的统计、分析、运算。常见的聚合有三类&#xff1a; ①、桶聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组。Date Histogram&#xff1a;按照日期解题分组&#xff0c;例如一周为一组&am…

Linux--12--Kernel panic – not syncing: Attempted to kill init! Redhat6.2故障修复

1、Linux环境 Redhat6.2&#xff0c; Linux version 2.6.32-220.el6.i686 (mockbuildx86-003.build.bos.redhat.com) (gccversion 4,4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP Wed Nov 9 08:02:18 EST 2011 2、故障现象 修改TCP相关文件&#xff0c;重启完Linux系统之…