马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 yinda_peng 于 2024-3-31 19:40 编辑
梯度下降法
梯度下降法可以说是非常常用的基础算法,是通过求参数的梯度,沿着负梯度方向(最速下降方向)去更新,来使得cost function取得极小。需要提醒的是,梯度下降法在目标函数是convex function时取到全局极小点,也就是最小,而当目标函数unconvex时,就可能出现陷入局部极小的情况,这时可以考虑一些其他手段,或是采用模拟退火算法、遗传算法等。
#梯度下降
import numpy as np
import pandas as pd
def gradient_descent(X,y,theta,rate,iter):
m = len(y)
for i in range(iter):
gradient = (1/m) * X.T.dot(X.dot(theta)-y)
theta -= rate * gradient
return theta
随机梯度下降
随机梯度下降基本与梯度下降法类似,不同的点在于每次迭代只使用一个样本来计算梯度,以达到随机效果,这样做能够以更快的速度更新参数。
#随机梯度下降
import numpy as np
import pandas as pd
def stochastic_gradient_descent(X,y,theta,rate,iter):
m = len(y)
for i in range(iter):
for j in range(m):
gradient = X[j].T.dot(X[j].dot(theta)-y[i])
theta -= rate * gradient
return theta
动量法
动量法是在梯度下降法上加的改进,它在梯度下降的基础上引入动量项,这样让参数的下降方向不仅仅取决于当前的梯度,还取决于之前状态下的梯度,或者说取决于历史梯度,这样做的目的是什么呢?当学习率rate较大时,可能出现在极小点附近来回摆动的震荡状态,引入动量项,可以减少这种震荡来加速收敛。
#动量法
def momentum_gradient_descent(X,y,theta,beta,rate,iter):
m = len(y)
k = np.zeros_like(theta)
for i in range(iter):
gradient = (1/m) * X.T.dot(X.dot(theta) - y)
k = beta * k + (1 - beta)*gradient
theta -= rate * k
return theta
|