史上最直白的logistic regression教程 之 一

原创
2017/01/17 09:50
阅读数 23
本系列前四篇是随手涂鸦,只为讲清问题,有口语化,且有少数符号误写,以及重复絮叨,且不打算修改:) 第5篇提供了一个严谨的学术语言的完整pdf文档,敬请下载!

Logistic Regession是什么

Logistic Regression是线性回归,但最终是用作分类器:它从样本集中学习拟合参数,将目标值拟合到[0,1]之间,然后对目标值进行离散化,实现分类。

为什么叫Logistic呢?因为它使用了Logisitic函数,形如:

f(z)=ezez+1=11+ez

这个函数有一些很有趣的性质,后面会谈到。

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 维,以数学形式表示为 xiR(k+1)×1 WR1×(k+1) ,后面我们一直使用这种表示方式。

如果我们在公式 [1] 的样本集上做拟合,就要是公式 [6] 在公式 [1] 上误差最小。通常选择的误差形式是平方和误差,因为它求导方便,做梯度优化的时候计算便捷。误差形式如下

Loss=12i=1n(yiWxi)2[7]

公式 [7] 是二次方程,有最小值,当它取最小值的时候的 W 就是最优拟合参数。

求解优化问题

公式 [7] 的求解不难,它有精确解,但当样本量很大的时候,精确解的求解是有问题的,比如矩阵是奇异阵不能求逆。所以通常会使用梯度下降法求解。

梯度下降法的方式是,先随机给 W 赋值,然后沿着公式 [7] 一阶偏导的反方向计算下降量值,多次重复,最终会让公式 [7] 收敛到一个极小值。那么,这个更新公式就是:

W=W+W=WLossW[8]

公式 [8] 有些复杂,用更简单的方式,可以写成如下方式:
wi=wi+wi=wiLosswi[9]

现在,我们用最原始的方式求解 Losswj

Losswj=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]

显然, XRn×(k+1)
那么,公式 [10] 最后一个等式中的 ni=1(yi×xi,j) 就可以写成
i=1n(yi×xi,j)=Yx1,jx2,j...xn,j[13]

ni=1Wxixi,j 可以写成
i=1nWxixi,j=WXTx1,jx2,j...xn,j[14]

所以,公式 [10] 最终可以表示成
Losswj=(YWXT)x1,jx2,j...xn,j[15]

注意,现在有一个很有意思的地方, (YWXT) 是拟合误差,在更新 W 的过程中,每轮会进行一次计算。
根据公式 [15] ,对 W 而言,我们有了一个更为整体的计算方式:
W=(YWXT)X[16]

所以,以梯度下降法计算最优 W 的更新公式是:
W=W+(YWXT)X[17]

下一篇我们用python实现公式[17]

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部