包括三部分,代码(这里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()