其中git
对于数据集,
表明第
条数据的类标签,
表明第
条数据的特征,
表明第
条数据的
个特征。github
假定目标函数为凸函数,且两阶连续可微,函数的最小值为
。算法
梯度在数学上的定义是:梯度的方向是变化速度最快的方向。 这样的意义在于,沿着梯度的方向,更加容易找到函数的最大值;若相反,梯度减小也最快,更容易找到最小值。bash
在logistics 模型中,计算目标函数对每一个特征的权重的偏导数。dom
则权重的更新为:ide
每一步走的距离在极值点附近很是重要,若是走的步子过大,容易在极值点附近震荡而没法收敛。函数
解决办法:将设定为随着迭代次数而不断减少的变量,可是也不能彻底减为零。学习
1.4.1 批量梯度降低法(Batch Gradient Descent) 批量梯度降低法,是梯度降低法最经常使用的形式,具体作法也就是在更新参数时使用全部的样原本进行更新。 1.4.2 随机梯度降低法(Stochastic Gradient Descent) 随机梯度降低法,其实和批量梯度降低法原理相似,区别在与求梯度时没有用全部的样本的数据,而是仅仅选取一个样原本求梯度。 随机梯度降低法,和批量梯度降低法是两个极端,一个采用全部数据来梯度降低,一个用一个样原本梯度降低。天然各自的优缺点都很是突出。对于训练速度来讲,随机梯度降低法因为每次仅仅采用一个样原本迭代,训练速度很快,而批量梯度降低法在样本量很大的时候,训练速度不能让人满意。对于准确度来讲,随机梯度降低法用于仅仅用一个样本决定梯度方向,致使解颇有可能不是最优。对于收敛速度来讲,因为随机梯度降低法一次迭代一个样本,致使迭代方向变化很大,不能很快的收敛到局部最优解。 1.4.3 小批量梯度降低法(Mini-batch Gradient Descent) 小批量梯度降低法是批量梯度降低法和随机梯度降低法的折衷,也就是对于
个样本,咱们采用
个样原本迭代,
,通常
,固然根据样本的数据,能够调整这个值。优化
#==============梯度上升优化算法=======================#
def _batchGradientAscent(self, nums, lr):
''' 梯度上升优化算法 ------ :param nums: <np.ndarray>迭代次数 :param lr: <np.ndarray>学习率 :return: '''
for k in range(nums):
print('%d th iterations' % k)
output = self.predict(self.input_vecs)
delta = lr * (self.labels - output.T)
delta_weight = np.dot(self.input_vecs.T, delta)
self.weight += delta_weight.T
# ==============随机梯度上升优化算法=======================#
def _StochasticGradientAscent0(self, lr):
''' 随机梯度上升优化算法 ------ :param lr: <np.ndarray>学习率 :return: '''
for inum in range(self.n_nums):
output = self.predict(self.input_vecs[inum])
delta = lr * (self.labels[inum] - output.T)
delta_weight = self.input_vecs[inum] * delta
self.weight += delta_weight.T
# ==============随机梯度上升优化算法=======================#
def _StochasticGradientAscent1(self, nums):
''' 随机梯度上升优化算法 ------ :param nums: <np.ndarray>迭代次数 :return: '''
for iteration in range(nums):
for inum in range(self.n_nums):
data_index = [_ for _ in range(self.n_nums)]
lr = 4 / (iteration + inum + 1) + 0.01
rand_index = int(random.uniform(0, self.n_nums))
output = self.predict(self.input_vecs[rand_index])
delta = lr * (self.labels[rand_index] - output.T)
delta_weight = self.input_vecs[rand_index] * delta
self.weight += delta_weight.T
del(data_index[rand_index])
# ==============小批量梯度上升优化算法=======================#
def _MiniBatchGradientAscent(self, nums, lr, batch_size=16):
''' 小批量梯度上升优化算法 ------ :param nums: <np.ndarray>迭代次数 :param lr: <np.ndarray>学习率 :param batch_size: <np.ndarray>批学习大小 :return: '''
for iteration in range(nums):
for ibatch in range(1, self.n_nums // batch_size):
start_index = (ibatch-1) * batch_size
end_index = ibatch * batch_size
mini_train_data = self.input_vecs[start_index: end_index, ]
mini_label = self.labels[start_index: end_index, ]
output = self.predict(mini_train_data)
delta = lr * (mini_label - output.T)
delta_weight = np.dot(mini_train_data.T, delta)
self.weight += delta_weight.T
def train(self, nums, optimization='gradAscent', lr=0.001):
''' 训练logistics模型 :param nums: 迭代次数 :param input_vecs: 训练样本的特征值 :return: '''
if optimization == 'gradAscent':
self._batchGradientAscent(nums, lr)
elif optimization == 'SGA0':
self._StochasticGradientAscent0(lr)
elif optimization == 'SGA1':
self._StochasticGradientAscent1(nums)
elif optimization == 'MGA':
self._MiniBatchGradientAscent(nums, lr, batch_size=16)
复制代码
利用牛顿法判断函数的解。设在为当前极小值的估计点,由泰勒公式可知ui
令,若
不知足条件,则迭代式可为
此时可认定为比
更接近与0,当
的时候收敛。
若要有极值点,则须要
,故有
当矩阵非奇异矩阵时,有