首先稍微再补充一点理论性的知识。
关于最小化代价函数的几种算法。
- Gradient Descent
- Normal equation
- Conjugate gradient
- BFGS
- L-BFGS
由于难度原因本篇只关注gradient descent梯度下降法,这个方法应用比较广泛,在无法使用正规方程法的许多条件下依然可以奏效,其对比正规方程法的优点是在数据量较大的时候仍然能取得较好的结果因为其复杂度 n2 n 2 数量级,而正规方程法则达到了 n3 n 3 的数量级。其缺点则是需要选取 α α ,以及需要一定数量的迭代。
另外在应用中需要注意的就是Feature scaling,梯度下降法是需要对特征值进行处理的,确保大致在统一尺度上,而正规方程法则不需要考虑这个方面。
其算法的主要逻辑就是根据微积分学上的梯度进行值的迭代变化(因为梯度方向是函数值变化最快的方向)
Repeat{
θj=θj−α∗1m∑mi=1(hθ(x(i))−y(i))∗X(i)j θ j = θ j − α ∗ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ∗ X j ( i )
}
Notes:simultaneously updata θj θ j for j=0,1….n
其次是对于上一篇博客中一些公式的推导
极大似然法与梯度下降
在上一章的实战环节中其中一段梯度下降的核心代码如下所示:
def gradAscent(dataMatIn,classLabels):
# 将普通矩阵转化为numpy矩阵数据类型
dataMatrix=mat(dataMatIn)
# 矩阵的转置,转化为列矩阵
labelMat=mat(classLabels).transpose()
m,n=shape(dataMatrix)
alepha=0.001
maxCycles=500
weights=ones((n,1))
for k in range(maxCycles):
h=sigmoid(dataMatrix*weights)
error=(labelMat-h)
weights=weights+alepha*dataMatrix.transpose()*error
return weights
当时第一次接触到这个代码的时候就产生了困惑,这一部分代码明明在梯度下降这个模块,可是梯度在哪呢?下面将从一开始进行一步步的推导。
声明:
p(y=1|x;θ)=hθ(x) p ( y = 1 | x ; θ ) = h θ ( x )
p(y=0|x;θ)=1−hθ(x) p ( y = 0 | x ; θ ) = 1 − h θ ( x )
根据极大似然法的思想可以得到极大似然函数:
L(θ)=∏(