SGD (python 含详细注释),最速下降法

包括三部分,代码(这里w设置为矩阵,方便大家理解矩阵更新),最速下降意义(如何求得更新公式),具体例子

最速下降和随机梯度下降是一样一样的,喂入的数据随机的就是随机梯度下降

当然最速梯度下降和随机梯度下降很有点区别的,最速梯度下降学习率使用了线性搜索armji法则(这里不再详细分析)

1.最速梯度下降法的含义或意义

 代码的例子

!!!!!!注意,w的初始化一定初值不能全一样,如果初值全一样,那么更新过程就完全一样了,w的多维就完全失去意义了

代码

import numpy as np
import random
SEED = 1



def SGD(x, y, w, alpha, m , max_iteration):
    """
    随机梯度下降法:stochastic_Gradient_Descent
    :param x:train_data
    :param y:train_label
    :param w:初始化权重
    :param alpha:学习速率
    :param m:
    :param max_iteration:迭代次数
    :return:
    """
    data = list(range(4))

    for i in range(0, max_iteration):

        index = random.sample(data, 1)[0]  # 从data列表中随机选取一个数,SGD 随机梯度下降,随机就是体现在这个地方,其实顺序喂入也是随机的一种
        z = y[index]
        print z.shape
        hypothesis = np.dot(x[index], w) # 计算神经网络的输出(无激活函数),前向传播过程
        print hypothesis.shape
        print z.shape
        loss = hypothesis - z  # 损失函数
        # 下降梯度
        # print z.shape
        # print loss.shape
        temp = np.mat(x[index])
        print temp.shape
        loss=np.reshape(loss, (1, -1))
        gradient = np.dot(temp.T, loss)#损失函数是吴恩大上的 损失函数: 1/2 ×(y- y(x))**2  导数就是 : (y-y(x)) *x  !!!注意这里是对 w 求导, x 是常数 

        # 求导之后得到theta
        w = w - alpha * gradient

    return w


def main():
    train_data = np.array([[1, 4, 2], [2, 5, 3], [5, 1, 6], [4, 2, 8]])
    train_label = np.array([[19 ,12],[26, 14],[19,15],[20,16]] )
     # [[19 ,12],[26, 14],[19,15],[20,16]]
    m, n = np.shape(train_data)  # 读取矩阵的长度,shape[0]就是读取矩阵第一维度的长度

    rdm = np.random.RandomState(SEED)#生成伪随机数,seed是初始化数
    #如果输入 label ,变成 4行两列 , w 就变成 3行两列了
    w = rdm.rand(n,2) #初始化 权重 w
    max_iteration = 500  # 迭代次数
    alpha = 0.01  # 学习速率

   
    w = SGD(train_data, train_label, w, alpha, m, max_iteration)
    print(w)


if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/qq_42105426/article/details/89669957