计算梯度时,使用全部的样本,换句话说就是,每一次参数更新,使用所有的样本
缺点:当样本很多时,训练过程非常慢
计算梯度的时,仅仅使用一个样本,换句话说就是,每一次参数更新,使用一个样本。
换句话说,可以是个增量更新的过程。
缺点:每一次更新,计算出来的‘‘梯度’’并不是真正的梯度,也就是说每一次更新,
并不是朝着整体最优的方向进行的。
计算梯度时,使用一部分样本。换句话说就是,每一次参数更新,使用样本中的一小部分
优点:是上面两种算法的一个平衡
python代码
from numpy import *
#input x input y
X = [[1, 1, 1], [2, 2, 2], [1, 1, 0], [5, 1, 0], [3, 2 , 1], \
[1, 0, 1], [7, 0, 2], [8, 1, 0], [5, 6, 5], [0, 0, 0]]
Y = [6, 11, 4, 12, 11, 5, 19, 18, 27, 1]
X, Y = mat(X), mat(Y)
X = insert(X, 0, ones(shape(X)[0]), axis=1)
m, n = shape(X)
#阈值 步长(步长较大,疯狂震荡), 最大迭代次数
threshold, step, iterator = 0.00001, 0.001, 10000
#初始化参数 计算初始误差
theta = ones((n, 1))
preError = sum(0.5 * power(X * theta - Y.transpose(), 2)) / m
times = 0
while times < iterator:
times += 1
theta = theta - step * X.transpose() * (X * theta - Y.transpose())
#计算新参数的误差
error = sum(0.5 * power(X * theta - Y.transpose(), 2)) / m
if abs(preError - error) < threshold:
break
else:
preError = error
print ('ParValue: ', theta)
from numpy import *
#input x input y
X = [[1, 1, 1], [2, 2, 2], [1, 1, 0], [5, 1, 0], [3, 2 , 1], \
[1, 0, 1], [7, 0, 2], [8, 1, 0], [5, 6, 5], [0, 0, 0]]
Y = [6, 11, 4, 12, 11, 5, 19, 18, 27, 1]
X, Y = mat(X), mat(Y)
X = insert(X, 0, ones(shape(X)[0]), axis=1)
m, n = shape(X)
#阈值 步长(步长较大,疯狂震荡), 最大迭代次数
threshold, step, iterator = 0.00001, 0.001, 10000
#初始化参数 计算初始误差
theta = ones((n, 1))
preError = sum(0.5 * power(X * theta - Y.transpose(), 2)) / m
times = 0
while times < iterator:
times += 1
for index in range(m):
#修改这一行
theta = theta - step * X[index].transpose() * (X[index] * theta - Y.transpose()[index])
#计算新参数的误差
error = sum(0.5 * power(X * theta - Y.transpose(), 2)) / m
if abs(preError - error) < threshold:
times = iterator
break
else:
preError = error
print ('ParValue: ', theta)
from numpy import *
#input x input y
X = [[1, 1, 1], [2, 2, 2], [1, 1, 0], [5, 1, 0], [3, 2 , 1], \
[1, 0, 1], [7, 0, 2], [8, 1, 0], [5, 6, 5], [0, 0, 0]]
Y = [6, 11, 4, 12, 11, 5, 19, 18, 27, 1]
X, Y = mat(X), mat(Y)
X = insert(X, 0, ones(shape(X)[0]), axis=1)
m, n = shape(X)
#阈值 步长(步长较大,疯狂震荡), 最大迭代次数
threshold, step, iterator = 0.00001, 0.001, 10000
#初始化参数 计算初始误差
theta = ones((n, 1))
preError = sum(0.5 * power(X * theta - Y.transpose(), 2)) / m
#一次选三个小样本
b = 3; times = 0
while times < iterator:
times += 1; start = 0
while start < m:
tempX = X[start:start+b]
tempY = Y.transpose()[start:start+b];
#修改这一行
theta = theta - step * tempX.transpose() * (tempX * theta - tempY)
#计算新参数的误差
error = sum(0.5 * power(X * theta - Y.transpose(), 2)) / m
if abs(preError - error) < threshold:
time = iterator
break
else:
preError = error
start += b
print ('ParValue: ', theta)