# 梯度下降法的三种形式BGD、SGD以及MBGD

## 实例以及代码详解

 1 #coding=utf-8
2 import numpy as np
3 import random
4
5 #下面实现的是批量梯度下降法
6 def batchGradientDescent(x, y, theta, alpha, m, maxIterations):
7     xTrains = x.transpose()                             #得到它的转置
8     for i in range(0, maxIterations):
9         hypothesis = np.dot(x, theta)
10         loss = hypothesis - y
11         # print loss
12         gradient = np.dot(xTrains, loss) / m             #对所有的样本进行求和，然后除以样本数
13         theta = theta - alpha * gradient
14     return theta
15
16 #下面实现的是随机梯度下降法
17 def StochasticGradientDescent(x, y, theta, alpha, m, maxIterations):
18     data = []
19     for i in range(10):
20         data.append(i)
21     xTrains = x.transpose()     #变成3*10，没一列代表一个训练样本
22     # 这里随机挑选一个进行更新点进行即可（不用像上面一样全部考虑）
23     for i in range(0,maxIterations):
24         hypothesis = np.dot(x, theta)
25         loss = hypothesis - y                   #注意这里有10个样本的，我下面随机抽取一个进行更新即可
26         index = random.sample(data,1)           #任意选取一个样本点，得到它的下标,便于下面找到xTrains的对应列
27         index1 = index[0]                       #因为回来的时候是list，我要取出变成int，更好解释
29         theta = theta - alpha * gradient.T
30     return theta
31
32 def predict(x, theta):
33     m, n = np.shape(x)
34     xTest = np.ones((m, n+1))                     #在这个例子中，是第三列放1
35     xTest[:, :-1] = x                             #前俩列与x相同
36     res = np.dot(xTest, theta)                    #预测这个结果
37     return res
38
39 trainData = np.array([[1.1,1.5,1],[1.3,1.9,1],[1.5,2.3,1],[1.7,2.7,1],[1.9,3.1,1],[2.1,3.5,1],[2.3,3.9,1],[2.5,4.3,1],[2.7,4.7,1],[2.9,5.1,1]])
40 trainLabel = np.array([2.5,3.2,3.9,4.6,5.3,6,6.7,7.4,8.1,8.8])
41 m, n = np.shape(trainData)
42 theta = np.ones(n)
43 alpha = 0.1
44 maxIteration = 5000
45 #下面返回的theta就是学到的theta
46 theta = batchGradientDescent(trainData, trainLabel, theta, alpha, m, maxIteration)
47 print "theta = ",theta
48 x = np.array([[3.1, 5.5], [3.3, 5.9], [3.5, 6.3], [3.7, 6.7], [3.9, 7.1]])
49 print predict(x, theta)
50 theta = StochasticGradientDescent(trainData, trainLabel, theta, alpha, m, maxIteration)
51 print "theta = ",theta
52 x = np.array([[3.1, 5.5], [3.3, 5.9], [3.5, 6.3], [3.7, 6.7], [3.9, 7.1]])
53 print predict(x, theta)
54 #yes,is the code

## 三种梯度下降方法的总结

1.批梯度下降每次更新使用了所有的训练数据，最小化损失函数，如果只有一个极小值，那么批梯度下降是考虑了训练集所有数据，是朝着最小值迭代运动的，但是缺点是如果样本值很大的话，更新速度会很慢。

2.随机梯度下降在每次更新的时候，只考虑了一个样本点，这样会大大加快训练数据，也恰好是批梯度下降的缺点，但是有可能由于训练数据的噪声点较多，那么每一次利用噪声点进行更新的过程中，就不一定是朝着极小值方向更新，但是由于更新多轮，整体方向还是大致朝着极小值方向更新，又提高了速度。

3.小批量梯度下降法是为了解决批梯度下降法的训练速度慢，以及随机梯度下降法的准确性综合而来，但是这里注意，不同问题的batch是不一样的，听师兄跟我说，我们nlp的parser训练部分batch一般就设置为10000，那么为什么是10000呢，我觉得这就和每一个问题中神经网络需要设置多少层，没有一个人能够准确答出，只能通过实验结果来进行超参数的调整。

[Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD

http://www.cnblogs.com/pinard/p/5970503.html

posted @ 2017-10-10 14:51  wyu123  阅读(8413)  评论(3编辑  收藏