python|随机梯度下降和Adagard python 手推公式代码讲解以线性回归为例

梯度下降算法两个步骤:得到梯度下降的目标函数,得到梯度表达式
利用sgd对线性回归进行梯度下降的目标函数为:
python|随机梯度下降和Adagard python 手推公式代码讲解以线性回归为例
文章图片

利用Adagard对线性回归进行梯度下降的目标函数为:
python|随机梯度下降和Adagard python 手推公式代码讲解以线性回归为例
文章图片

而后求梯度即可
1.创建数据

import numpy as np x=np.random.randn(1000,2) x=np.concatenate((x,np.ones([1000, 1])),axis=1)#增加一列常数项 r=np.random.randn(1000,1) y=0.5*x[:,0]+3*x[:,1]+r[:,0]/10000+1.5 y=y.reshape(1000,1)

2.sgd实现:每次随机选取一个数据进行梯度下降
def sgd_compute_max(x,y,alpha): dim=x.shape[1] w = np.zeros([1, dim]) for i in range(1000): index=np.random.randint(0,len(y[:,0])-1) gradient=np.dot(np.array(x[index,:],ndmin =2).transpose(),np.dot(x[index,:],w.transpose())-y[index,0]) w-=alpha*gradient return w

【python|随机梯度下降和Adagard python 手推公式代码讲解以线性回归为例】3.Adagard实现:每次将全部样本进行梯度下降,且learning_rate需除以梯度平方的累加开方
def adagrad_compute(x,y,alpha): alpha=0.01 dim=x.shape[1] w = np.zeros([dim,1 ]) n=len(y[:,0]) eps=0.00001#避免分子为0 adagrad = np.zeros([dim, 1]) for i in range(1000): gradient=np.dot(x.transpose(), np.dot(x, w) - y) gradient2=gradient*gradient adagrad+=gradient2 w-=alpha*n*gradient/np.sqrt(adagrad + eps) return w

    推荐阅读