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

梯度下降算法两个步骤:得到梯度下降的目标函数,得到梯度表达式
利用sgd对线性回归进行梯度下降的目标函数为:
在这里插入图片描述
利用Adagard对线性回归进行梯度下降的目标函数为:
在这里插入图片描述
而后求梯度即可
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

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

你可能感兴趣的:(python,机器学习,线性代数,随机梯度下降,adagrad算法)