本系列前四篇是随手涂鸦,只为讲清问题,有口语化,且有少数符号误写,以及重复絮叨,且不打算修改:) 第5篇提供了一个严谨的学术语言的完整pdf文档,敬请下载!
Logistic Regession是什么
Logistic Regression是线性回归,但最终是用作分类器:它从样本集中学习拟合参数,将目标值拟合到[0,1]之间,然后对目标值进行离散化,实现分类。
为什么叫Logistic呢?因为它使用了Logisitic函数,形如:
f(z)=ezez+1=11+e−z
这个函数有一些很有趣的性质,后面会谈到。
Logistic regression有一定的复杂度。对新人来说,最好有一个完整的推导指南,然后反复推导N遍(N>=5),直至能独立推导,再用python或者java实现这个推导,然后用这个实现解决一个实际应用,这样差不多算是掌握Logistic regression了。上述过程缺一不可,而且是成本最小的学习方案。
Logistic regression很重要,据说google的Ads广告使用的预测算法就是一个大Logistic regression模型。
Logistic regression涉及机器学习的多个重要概念,样本集,特征,向量,损失函数,最优化方法,梯度下降。如果对logistic regression能做到庖丁屠牛的程度,对未来进行模式识别和机器学习有事半功倍的收益。
我们现从一个最简单的问题开始,然后逐步增加功能,最终实现logistic regression。
先从一个最简单的问题开始
假如有一组样本,形如
{x1,y1},{x2,y2},...,{xi,yi},...{xn,yn}[1]
xi 的值决定
yi 的值,也就是说
xi 是自变量,
yi 是因变量,每个
xi 对应一个
yi 。从脚标可以看出,这组样本一共有
n 个。
xi 是一个向量,也就是说, xi 里有多个元素,也就是可以表示为
xi=[xi,1,xi,2,...,xi,j,...xi,k]T[2]
显然,
k 表示
xi 的第
k 维。
实际上 xi 也可以写成
xi=[xi,1,xi,2,...,xi,j,...xi,k] ,如果这样的话,后面的 W 和公式 [6] 就要做一点改动。如果推导过程很熟悉,可以将 W , xi , X , yi , Y 等根据需求随意改变,不作限定。
我们拟合 xi 和 yi 的关系,有了拟合,就可以根据 xi 计算 yi 。最简单的拟合方式是线性拟合,也就是形如:
yi=w0+w1×xi,1+w2×xi,2+...+wk×xi,k[3]
w0 看起来不够和谐,跟其他元素不太一样,对 xi 做一点修改可以解决这个问题,将所有的 xi 重新表示成
xi=[1,xi,1,xi,2,...,xi,j,...,xi,k]T[4]
那么,我们就得到:
yi=w0×1+w1×xi,1+w2×xi,2+...+wk×xi,k[5]
这个公式的好处是,我们可以用向量方式表示了:
yi=Wxi[6]
也就是说,
W=[w0,w1,...,wk]
注意,此时的
xi 不再是
k 维了,而是
k+1 维,同样
W 也是
k+1 维,以数学形式表示为
xi∈R(k+1)×1 ,
W∈R1×(k+1) ,后面我们一直使用这种表示方式。
如果我们在公式 [1] 的样本集上做拟合,就要是公式 [6] 在公式 [1] 上误差最小。通常选择的误差形式是平方和误差,因为它求导方便,做梯度优化的时候计算便捷。误差形式如下
Loss=12∑i=1n(yi−Wxi)2[7]
公式
[7] 是二次方程,有最小值,当它取最小值的时候的
W 就是最优拟合参数。
求解优化问题
公式 [7] 的求解不难,它有精确解,但当样本量很大的时候,精确解的求解是有问题的,比如矩阵是奇异阵不能求逆。所以通常会使用梯度下降法求解。
梯度下降法的方式是,先随机给 W 赋值,然后沿着公式 [7] 一阶偏导的反方向计算下降量值,多次重复,最终会让公式 [7] 收敛到一个极小值。那么,这个更新公式就是:
W=W+△W=W−∂Loss∂W[8]
公式
[8] 有些复杂,用更简单的方式,可以写成如下方式:
wi=wi+△wi=wi−∂Loss∂wi[9]
现在,我们用最原始的方式求解
∂Loss∂wj 。
∂Loss∂wj=∂12[(y1−(w0×1+w1× x1,1+...+wk×x1,k))2+(y2−(w0×1+w1× x2,1+...+wk×x2,k))2+...+(yn−(w0×1+w1× xn,1+...+wk×xn,k))2]/∂wi=−[(y1−(w0×1+w1× x1,1+...+wk×x1,k))×w1,j+(y2−(w0×1+w1× x2,1+...+wk×x2,k))×w2,j+...+(yn−(w0×1+w1× xn,1+...+wk×xn,k))×wn,j]=−∑i=1n(yi−(w0×1+w1×xi,1+...+wk×xi,k))×xi,j=−∑i=1n(yi×xi,j)+∑i=1nWxixi,j[10]
注意我们要把公式 [10] 改写成矩阵形式,因为矩阵计算更有效率,方便实现。
将 yi 写成矩阵形式,令
Y=[y1,y2,...,yn][11]
将
xi 写成矩阵形式,令
X=⎛⎝⎜⎜⎜⎜11...1x1,1x2,1...xn,1x1,2x2,2...xn,2............x1,jx2,j...xn,j............x1,kx2,kxn,k⎞⎠⎟⎟⎟⎟[12]
显然,
X∈Rn×(k+1) 。
那么,公式
[10] 最后一个等式中的
∑ni=1(yi×xi,j) 就可以写成
∑i=1n(yi×xi,j)=Y⎛⎝⎜⎜⎜⎜x1,jx2,j...xn,j⎞⎠⎟⎟⎟⎟[13]
而
∑ni=1Wxixi,j 可以写成
∑i=1nWxixi,j=WXT⎛⎝⎜⎜⎜⎜x1,jx2,j...xn,j⎞⎠⎟⎟⎟⎟[14]
所以,公式
[10] 最终可以表示成
∂Loss∂wj=−(Y−WXT)⎛⎝⎜⎜⎜⎜x1,jx2,j...xn,j⎞⎠⎟⎟⎟⎟[15]
注意,现在有一个很有意思的地方,
(Y−WXT) 是拟合误差,在更新
W 的过程中,每轮会进行一次计算。
根据公式
[15] ,对
W 而言,我们有了一个更为整体的计算方式:
△W=(Y−WXT)X[16]
所以,以梯度下降法计算最优
W 的更新公式是:
W=W+(Y−WXT)X[17]
下一篇我们用python实现公式[17]