秦皇岛网站建设seo,免费做视频的软件app,做电影网站什么后果,自适应wordpress博客一、梯度下降法(GD#xff0c;Gradient Descent)
Ⅰ、得到目标函数J(θ)#xff0c;求解使得J(θ)最小时的θ值 当然#xff0c;这里只是取了俩特征而已#xff0c;实际上会有m个特征维度
通过最小二乘法求目标函数最小值 令偏导为0即可求解出最小的θ值#xff0c;即…一、梯度下降法(GDGradient 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θ(t1) θ(t) - grand*learning_rate 这里的learning_rate常用α表示学习率是个超参数太大的话步子太大容易来回震荡太小的话迭代次数很多耗时。 4grad threshold时迭代停止收敛其中threshold也是个超参数 超参数需要用户传入的参数若不传使用默认的参数。
Ⅵ、代码实现
导包
import numpy as np
import matplotlib.pyplot as plt初始化样本数据
# 这里相当于是随机X维度X1rand是随机均匀分布
X 2 * np.random.rand(100, 1)# 人为的设置真实的Y一列np.random.randn(100, 1)是设置errorrandn是标准正太分布
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维度X1rand是随机均匀分布
X 2 * np.random.rand(100, 1)
# 人为的设置真实的Y一列np.random.randn(100, 1)是设置errorrandn是标准正太分布
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()二、批量梯度下降法(BGDBatch Gradient Descent)
Ⅰ、梯度下降法流程
梯度下降法流程 1初始化thetaw0…wn 2接着求梯度gradient 3theta_t1 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 * (Xtheta - y)
上面就是批量梯度下降的时候去求解gradients梯度的公式 不管是批量梯度下降还是随机梯度下降流程里面的134都是一样的只有第二步求梯度稍有不同
Ⅱ、批量梯度下降法(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初始化thetaw0...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)三、随机梯度下降法(SGDStochastic Gradient Descent)
批量梯度下降法中考虑了所有的样本的梯度找到最优梯度然后再往下走很慢。 随机梯度下降则从所有的样本中随机找一个样本的梯度然后按这个梯度向下走
完整代码
import numpy as npdef learning_schedule(t):#随着迭代次数的增加会相应的减小学习率return t0 / (tt1)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_index1]#根据索引取出值yi y[random_index:random_index1]gradients 2*xi.T.dot(xi.dot(theta)-yi)#得到梯度learning_rate learning_schedule(epoch*mi)#随着迭代次数的增加会相应的减小学习率theta theta - learning_rate * gradients#根据梯度下降公式调整θprint(theta)上面代码里面除了随机抽取一条数据来求解梯度还随着迭代次数的增多不断减小learning_rate最终减小步长
总结
Ⅰ随机梯度下降怎么随机的呢 答其实就是在求梯度的时候不再用所有的m个样本数据来计算而是随机的选择一条数据来计算梯度
Ⅱ随机梯度下降的好处是什么缺点是什么 答在求梯度的时候快迭代次数有可能更多最终可能落不到全局最优解上
ⅢMini-Batch GD是什么 答就是在求梯度的时候做了一个折中不用所有的数据而是随机选择一部分数据来求梯度
Ⅳ为什么要不断的调整步长 答就是为了让越接近最优解的时候调整的幅度越小避免来回震荡
Ⅴ如果我们不人为的调小步长会不会随着迭代的次数增多调整的幅度自动减小 答调整的幅度取决于谁取决于学习率和梯度梯度事实上越接近最优解梯度的绝对值越小
四、小批量梯度下降法(MBGDMini-Batch Gradient Descent)
随机梯度下降法是随机抽取一个样本的梯度作为整体梯度进行下降速度上去了但是样本的随机选取很容易抽到不好的样本导致最终的结果偏差很大。批量梯度下降法考虑了所有样本的梯度选择最优但是速度太慢。 小批量梯度下降法随机选取一小部分样本的梯度选择其中最优的解作为最终的梯度。随着迭代次数的增加学习率会降低步长减小。