梯度下降法
-
批量梯度下降法BGD
-
随机梯度下降法SGD
-
小批量梯度下降发MSGD
BGD会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会 很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新 都会很慢。 SGD以高方差频繁更新,优点是使得SGD会跳到新的和潜在更好的局部最优解,缺点是 使得收敛到局部最优解的过程更加的复杂。 MBGD降结合了BGD和SGD的优点,每次更新的时候使用n个样本。减少了参数更新的次 数,可以达到更加稳定收敛结果,一般在深度学习当中可以采用这种方法,将数据一 个batch一个batch的送进去训练。
使用BGD求解逻辑回归
每个回归系数初始化为1
重复下面步骤直至收敛:
计算整个数据集的梯度
使用alpha*gradient更新回归系数的向量
返回回归系数
代码实现:
# 导入数据集
import pandas as pd
import numpy as np
dataSet = pd.read_table('testSet.txt',header = None)
dataSet.columns =['X1','X2','labels']
dataSet.head()
# 定义sigmoid函数
def sigmoid(x):
s = 1/(1 + np.exp(-x))
return s
# 定义标准化函数,可以更快收敛
def regularize(xMat):
inMat = xMat.copy()
inMeans = np.mean(inMat,axis = 0) # 求每一列的均值
inVar = np.std(inMat,axis = 0) # 求每一列的方差
inMat = (inMat - inMeans)/inVar # 每一个特征属性标准化
return inMat
# 定义BGD梯度下降函数更新θ
def BGD_LR(dataSet,alpha=0.001,maxCycles=500): # alpha步长,maxCycles最大迭代次数
yMat = np.mat(dataSet.iloc[:,-1].values).T
xMat = regularize(xMat)
m,n = xMat.shape
weights = np.zeros((n,1)) 有几个特征,定义几个权重值,这里将权重值初始化为0
for i in range(maxCycles):
grad = xMat.T*(xMat * weights-yMat)/m # 这里是BGD的矩阵方式描述求梯度的公式,可以换成SGD的公式或者其他
weights = weights -alpha*grad
return weights
# 建立主函数
def logisticAcc(dataSet, method, alpha=0.01, maxCycles=500): # method可以选择BGD或者SGD等
weights = method(dataSet,alpha=alpha,maxCycles=maxCycles)
p = sigmoid(xMat * weights).A.flatten()
for i, j in enumerate(p):
if j < 0.5:
p[i] = 0
else:
p[i] = 1
train_error = (np.fabs(yMat.A.flatten() - p)).sum()
trainAcc = 1 - train_error / yMat.shape[0]
return trainAcc
logisticAcc(dataset, SGD_LR)