三、梯度下降法求解最优θ值

一、梯度下降法(GD,Gradient Descent)

Ⅰ、得到目标函数J(θ),求解使得J(θ)最小时的θ值

在这里插入图片描述
当然,这里只是取了俩特征而已,实际上会有m个特征维度

通过最小二乘法求目标函数最小值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
令偏导为0即可求解出最小的θ值,即在这里插入图片描述

Ⅱ、判定为凸函数

凸函数有需要判断方法,比如:定义、一阶条件、二阶条件等。利用正定性判定使用的是二阶条件。
半正定一定是凸函数,开口朝上,半正定一定有极小值
在用二阶条件进行判定的时候,需要得到Hessian矩阵,根据Hessian的正定性判定函数的凹凸性。比如Hessian矩阵半正定,函数为凸函数;Hessian矩阵正定,函数为严格凸函数

Hessian矩阵:黑塞矩阵(Hessian Matrix),又称为海森矩阵、海瑟矩阵、海塞矩阵等,是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。

Ⅲ、Hessian矩阵

黑塞矩阵是由目标函数在点x处的二阶偏导数组成的对称矩阵
正定:对A的特征值全为正数,那么A一定是正定的
不正当:非正定或半正定
若A的特征值≥0,则半正定,否则,A为非正定。

对J(θ)损失函数求二阶导,之后得到的一定是半正定的,因为自己和自己做点乘。在这里插入图片描述

Ⅳ、解析解

在这里插入图片描述
数值解是在一定条件下通过某种近似计算得出来的一个数值,能在给定的精度条件下满足方程,解析解为方程的解析式(比如求根公式之类的),是方程的精确解,能在任意精度下满足方程。

Ⅴ、梯度下降法

这个课程跟其他课程讲的差不多,这里我就不再赘述了。梯度下降法

梯度下降法:是一种以最快的速度找到最优解的方法。

流程:
1,初始化θ,这里的θ是一组参数,初始化也就是random一下即可
2,求解梯度gradient
3,θ(t+1) = θ(t) - grand*learning_rate
这里的learning_rate常用α表示学习率,是个超参数,太大的话,步子太大容易来回震荡;太小的话,迭代次数很多,耗时。
4,grad < threshold时,迭代停止,收敛,其中threshold也是个超参数
超参数:需要用户传入的参数,若不传使用默认的参数。

Ⅵ、代码实现

导包

import numpy as np
import matplotlib.pyplot as plt

初始化样本数据

# 这里相当于是随机X维度X1,rand是随机均匀分布
X = 2 * np.random.rand(100, 1)
# 人为的设置真实的Y一列,np.random.randn(100, 1)是设置error,randn是标准正太分布
y = 4 + 3 * X + np.random.randn(100, 1)
# 整合X0和X1
X_b = np.c_[np.ones((100, 1)), X]
print(X_b)
"""
[[1.         1.01134124][1.         0.98400529][1.         1.69201204][1.         0.70020158][1.         0.1160646 ][1.         0.42502983][1.         1.90699898][1.         0.54715372][1.         0.73002827][1.         1.29651341][1.         1.62559406][1.         1.61745598][1.         1.86701453][1.         1.20449051][1.         1.97722538][1.         0.5063885 ][1.         1.61769812][1.         0.63034575][1.         1.98271789][1.         1.17275471][1.         0.14718811][1.         0.94934555][1.         0.69871645][1.         1.22897542][1.         0.59516153][1.         1.19071408][1.         1.18316576][1.         0.03684612][1.         0.3147711 ][1.         1.07570897][1.         1.27796797][1.         1.43159157][1.         0.71388871][1.         0.81642577][1.         1.68275133][1.         0.53735427][1.         1.44912342][1.         0.10624546][1.         1.14697422][1.         1.35930391][1.         0.73655224][1.         1.08512154][1.         0.91499434][1.         0.62176609][1.         1.60077283][1.         0.25995875][1.         0.3119241 ][1.         0.25099575][1.         0.93227026][1.         0.85510054][1.         1.5681651 ][1.         0.49828274][1.         0.14520117][1.         1.61801978][1.         1.08275593][1.         0.53545855][1.         1.48276384][1.         1.19092276][1.         0.19209144][1.         1.91535667][1.         1.94012402][1.         1.27952383][1.         1.23557691][1.         0.9941706 ][1.         1.04642378][1.         1.02114013][1.         1.13222297][1.         0.5126448 ][1.         1.22900735][1.         1.49631537][1.         0.82234995][1.         1.24810189][1.         0.67549922][1.         1.72536141][1.         0.15290908][1.         0.17069838][1.         0.27173192][1.         0.09084242][1.         0.13085313][1.         1.72356775][1.         1.65718819][1.         1.7877667 ][1.         1.70736708][1.         0.8037657 ][1.         0.5386607 ][1.         0.59842584][1.         0.4433115 ][1.         0.11305317][1.         0.15295053][1.         1.81369029][1.         1.72434082][1.         1.08908323][1.         1.65763828][1.         0.75378952][1.         1.61262625][1.         0.37017158][1.         1.12323188][1.         0.22165802][1.         1.69647343][1.         1.66041812]]
"""

在这里插入图片描述

# 常规等式求解theta
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)
"""
[[3.9942692 ][3.01839793]]
"""
# 创建测试集里面的X1
X_new = np.array([[0], [2]]) 
X_new_b = np.c_[(np.ones((2, 1))), X_new]
print(X_new_b)
y_predict = X_new_b.dot(theta_best)
print(y_predict)
"""
[[1. 0.][1. 2.]]
[[ 3.9942692 ][10.03106506]]
"""

绘图

plt.plot(X_new, y_predict, 'r-')
plt.plot(X, y, 'b.')
plt.axis([0, 2, 0, 15])
plt.show()

在这里插入图片描述

Ⅶ、完整代码

import numpy as np
import matplotlib.pyplot as plt# 这里相当于是随机X维度X1,rand是随机均匀分布
X = 2 * np.random.rand(100, 1)
# 人为的设置真实的Y一列,np.random.randn(100, 1)是设置error,randn是标准正太分布
y = 4 + 3 * X + np.random.randn(100, 1)# 整合X0和X1
X_b = np.c_[np.ones((100, 1)), X]
print(X_b)# 常规等式求解theta
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)# 创建测试集里面的X1
X_new = np.array([[0], [2]]) 
X_new_b = np.c_[(np.ones((2, 1))), X_new]
print(X_new_b)
y_predict = X_new_b.dot(theta_best)
print(y_predict)#绘图
plt.plot(X_new, y_predict, 'r-')
plt.plot(X, y, 'b.')
plt.axis([0, 2, 0, 15])
plt.show()

二、批量梯度下降法(BGD,Batch Gradient Descent)

Ⅰ、梯度下降法流程

梯度下降法流程:
1,初始化theta,w0…wn
2,接着求梯度gradient
3,theta_t+1 = theta_t - grad * learning_rate
learning_rate是个超参数,太大容易来回振荡,太小步子太短,需要走很长时间,不管太大还是太小,
都会迭代次数很多,耗时很长
4,等待grad < threshold,迭代停止,收敛,threshold是个超参数

推导线性回归的loss function的导函数,目的是可以更快的求解梯度!
grad_j = (1/m) * (Xj)^Transpose * (Xtheta - y)
grads = (1/m) * X^Transpose * (X
theta - y)

上面就是批量梯度下降的时候,去求解gradients梯度的公式!
不管是批量梯度下降,还是随机梯度下降,流程里面的1,3,4都是一样的,只有第二步求梯度稍有不同!
在这里插入图片描述

Ⅱ、批量梯度下降法(BGF)

在这里插入图片描述
初始化W,随机W,进行赋初始值
沿着负梯度方向迭代,更新后的W使得J(W)更小

Ⅲ、完整代码

import numpy as npX = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)learning_rate = 0.1
n_iterations = 10000
m = 100# 1,初始化theta,w0...wn
theta = np.random.randn(2, 1)
count = 0# 4,不会设置阈值,之间设置超参数,迭代次数,迭代次数到了,我们就认为收敛了
for iteration in range(n_iterations):count += 1# 2,接着求梯度gradientgradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)# 3,应用公式调整theta值,theta_t + 1 = theta_t - grad * learning_ratetheta = theta - learning_rate * gradientsprint(count)
print(theta)

三、随机梯度下降法(SGD,Stochastic Gradient Descent)

批量梯度下降法中考虑了所有的样本的梯度,找到最优梯度然后再往下走,很慢。
随机梯度下降则从所有的样本中随机找一个样本的梯度,然后按这个梯度向下走
在这里插入图片描述

完整代码
import numpy as npdef learning_schedule(t):#随着迭代次数的增加,会相应的减小学习率return t0 / (t+t1)X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)n_epoches = 500
t0,t1 = 5,50#超参数m = 100
theta = np.random.randn(2,1)#随机初始化θ值for epoch in range(n_epoches):#执行500次迭代for i in range(m):random_index = np.random.randint(m)#从m个样本中随机抽取一个,作为索引xi = X_b[random_index:random_index+1]#根据索引取出值yi = y[random_index:random_index+1]gradients = 2*xi.T.dot(xi.dot(theta)-yi)#得到梯度learning_rate = learning_schedule(epoch*m+i)#随着迭代次数的增加,会相应的减小学习率theta = theta - learning_rate * gradients#根据梯度下降公式调整θprint(theta)

上面代码里面除了随机抽取一条数据来求解梯度,还随着迭代次数的增多,不断减小learning_rate,最终减小步长!

总结

Ⅰ随机梯度下降,怎么随机的呢?
答:其实就是在求梯度的时候,不再用所有的m个样本数据来计算,而是随机的选择一条数据来计算梯度!

Ⅱ随机梯度下降的好处是什么?缺点是什么?
答:在求梯度的时候快,迭代次数有可能更多,最终可能落不到全局最优解上

ⅢMini-Batch GD是什么?
答:就是在求梯度的时候做了一个折中,不用所有的数据,而是随机选择一部分数据来求梯度!

Ⅳ为什么要不断的调整步长?
答:就是为了让越接近最优解的时候,调整的幅度越小,避免来回震荡!

Ⅴ如果我们不人为的调小步长,会不会随着迭代的次数增多,调整的幅度自动减小?
答:调整的幅度取决于谁?取决于学习率和梯度,梯度事实上越接近最优解,梯度的绝对值越小

四、小批量梯度下降法(MBGD,Mini-Batch Gradient Descent)

随机梯度下降法是随机抽取一个样本的梯度作为整体梯度进行下降,速度上去了,但是样本的随机选取很容易抽到不好的样本导致最终的结果偏差很大。批量梯度下降法考虑了所有样本的梯度,选择最优,但是速度太慢。
小批量梯度下降法随机选取一小部分样本的梯度,选择其中最优的解作为最终的梯度。随着迭代次数的增加学习率会降低,步长减小。

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

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

相关文章

leetcode 131. 分割回文串 思考分析

题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 思考 问题可以分为两个子问题&#xff1a;1、判断回文串2、分割数组 判断回文串 bool isPalindrome_string(string s,int startindex,int endinde…

android淡入淡出动画_在Android中淡入动画示例

android淡入淡出动画1) XML File: activity_main 1)XML文件&#xff1a;activity_main <?xml version"1.0" encoding"utf-8"?><android.support.constraint.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android&…

[慢查优化]联表查询注意谁是驱动表 你搞不清楚谁join谁更好时请放手让mysql自行判定...

写在前面的话&#xff1a; 不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程&#xff1b; 不要求每个人一定知道线上&#xff08;现在或未来&#xff09;哪张表数据量大&#xff0c;哪张表数据量小&#xff1b; 但把mysql客户端&#xff08;如SQL…

四、梯度下降归一化操作

一、归一化 Ⅰ什么是归一化&#xff1f; 答&#xff1a;其实就是把数据归一到0-1之间&#xff0c;也就是缩放。 常用的归一化操作是最大最小值归一化&#xff0c;公式如下&#xff1a; 例如&#xff1a;1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9&#xff0c;10…

[转帖][强烈推荐]网页表格(Table/GridView)标题栏和列冻结(跨浏览器兼容)

GridView的标题栏、列冻结效果(跨浏览器版) 本文来源&#xff1a;http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/02/18/supertable-plugin-for-jquery.aspx 稍早发表了GridView 的标题列冻结效果&#xff0c;足以满足工作上的需求&#xff0c;不过存在两个缺点:…

psu是什么电脑配件_PSU的完整形式是什么?

psu是什么电脑配件PSU&#xff1a;电源部门/公共部门事业 (PSU: Power Supply Unit / Public Sector Undertaking) 1)PSU&#xff1a;电源设备 (1) PSU: Power Supply Unit) PSU is an abbreviation of the "Power Supply Unit". PSU是“电源设备”的缩写 。 It is a…

【C++grammar】断言与表达式常量

目录1、常量表达式和constexpr关键字2、断言与C11的静态断言1.1. assert : C语言的宏(Macro)&#xff0c;运行时检测。1.2. assert()依赖于NDEBUG 宏1.3. assert 帮助调试解决逻辑bug &#xff08;部分替代“断点/单步调试”&#xff09;2.1static_assert (C11的静态断言 )2.2.…

一、Arduino UNO R3将数据上传至云平台

一、准备工作 ①ESP12E Shield ②Arduino UNO R3开发板 ③把ESP12E Shield安装到Arduino UNO R3开发板上 ④登录物联网平台注册个账号&#xff0c;到时候需要使用。 ⑤记录下来你的Uid和key到时候会用到 ⑥创建个设备&#xff0c;用于测试 ⑦beyondyanyu为设备名&…

leetcode 93. 复原IP地址 思考分析

题目 给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” …

二、通过云平台反向控制Arduino UNO R3

该篇博文是在第一篇博文(一、Arduino UNO R3将数据上传至云平台)的基础上进行的 一、云平台发送指令反向控制Arduino UNO R3 ESP12E Shield开关都推到OFF&#xff08;要不然下载会报错&#xff09;&#xff0c;往Arduino UNO R3开发板上下载下面的代码 这段代码进行测试要点&…

【C++grammar】代理构造、不可变对象、静态成员

目录1、Delegation Constructor&#xff08;代理构造&#xff09;1. What is delegating constructor? (什么是代理构造/委托构造)2. Avoiding recursive calls of target constructors (避免递归调用目标ctor)3. 委托构造的好处2、不可变对象和类1、如何让类成为“不可变类”…

RFID模块+WIFI模块+振动传感器+有源蜂鸣器+舵机+Arduino UNO R3所构成的门禁系统模块

该系统模块主要由RFID模块WIFI模块振动传感器有源蜂鸣器舵机Arduino UNO R3组成的门禁系统模块。这里使用舵机充当门锁&#xff0c;用户可以刷卡开门&#xff0c;也可以通过APP控制舵机状态达到开门的效果。若有不法分子想要强行进入室内&#xff0c;对门进行撞击或者人为的破坏…

ESP12E Shield+Arduino UNO R3开发板+DHT11温湿度模块+双色LED灯+有源蜂鸣器+光敏电阻模块+I2CLCD1602液晶显示器所构成的室内检测系统

室内检测系统由ESP12E ShieldArduino UNO R3开发板DHT11温湿度模块双色LED灯有源蜂鸣器光敏电阻模块I2CLCD1602液晶显示器所构成。DHT11温湿度模块获取室内温湿度数据通过I2CLCD1602液晶显示器进行显示&#xff0c;另一方面通过ESP12E Shield将数据上传至云平台。光敏电阻进行捕…

leetcode 202. 快乐数 思考分析(哈希集合与双指针解)

1、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为&#xff1a;对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和&#xff0c;然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果 可以变为 1&am…

五、线性回归和多项式回归实现

官网API 一、线性回归 针对的是损失函数loss faction Ⅰ、Lasso Regression 采用L1正则&#xff0c;会使得w值整体偏小&#xff1b;w会变小从而达到降维的目的 import numpy as np from sklearn.linear_model import Lasso from sklearn.linear_model import SGDRegresso…

深发展银行编码器(解剖)

电池拆下来&#xff0c;再装上&#xff0c;还能继续用下&#xff0c;不会被重置 转载于:https://www.cnblogs.com/ahuo/archive/2012/01/25/2329485.html

leetcode 1. 两数之和 思考分析

1、题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素不能使用两遍。 2、思考分析 双for循环的时间复杂度…

六、逻辑回归

一、何为逻辑回归 逻辑回归可以简单理解为是基于多元线性回归的一种缩放。 多元线性回归y的取值范围在(-∞&#xff0c;∞)&#xff0c;数据集中的x是准确的一个数值。 用这样的一个数据集代入线性回归算法当中会得到一个模型。 这个模型所具备的功能就是当有人给这个模型一个…

leetcode 383. 赎金信 思考分析

题目 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串&#xff0c;判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成&#xff0c;返回 true &#xff1b;否则返回 false。 (题目说明&#xff1a;为了不暴露赎金信字迹&#x…

Numpy(科学计算库)---讲解

本内容来自《跟着迪哥学Python数据分析与机器学习实战》&#xff0c;该篇博客将其内容进行了整理&#xff0c;加上了自己的理解&#xff0c;所做小笔记。若有侵权&#xff0c;联系立删。 迪哥说以下的许多函数方法都不用死记硬背&#xff0c;多查API多看文档&#xff0c;确实&a…