一直以来看到好多多优秀的博客,早就萌生了去写博客的想法,今天终于有时间写下自己的第一篇博客了。
刚好最近在看《机器学习实战》,姑且现学现用,就从这本书的logistic回归讲起吧。
其实第一遍看这个章节,也没有弄懂,尤其在下面这段代码:
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) #convert to NumPy matrix
labelMat = mat(classLabels).transpose() #convert to NumPy matrix
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
return weights
看完这段代码,脑子就蒙了,
for
循环中那
3
行在讲什么?
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
就是这3行。文中提到了梯度上升,以及梯度上升的公式
就是梯度,但是这个梯度到底是怎么计算出来的?梯度上升算法到底要求哪个函数的极值?
一脑子雾水。一开始就试着用物理意义去解释h, error, weights, 希望这样能弄懂代码的真是含义,但是不仅没有成功,反而更郁闷了。
本来可以跳过这个地方,直接想当然地认为这个算法其他地方看懂了,那就是懂了,但是我不想再自欺欺人了,所以就带着这两个问题去查了资料。
主要是参考这位哥们的分析弄懂的:http://blog.csdn.net/zouxy09/article/details/20319673,一下推导不分主要来自这个网站,有兴趣的可以直接去这个链接看
1.sigmoid函数
书中提到,为了更好地对数据分类,也就是能输出0或1,我们选择了sigmoid函数:
其中,z=W0X0+W1X1+W2X2+...+WnXn, 即
sigmoid有个比较有趣的特征,设我们的样本是{x,y},y是0或者1,那么y=1的概率可以表示为
那么,
这个式子下面推导会用到
2.logistic回归的学习算法
logistic回归的学习算法是最大似然。其实,这句话几乎已经回答了前面说的两个问题,这恰恰是书本中略去的地方。
假设我们有n个独立的训练样本,{(x1,y1),(x2,y2),(x3,y3)...(xn,yn)},y={0,1}
那每一个观察到的样本出现的概率是
当yi为1时,等式后取第一项,当yi为0时,等式后取第二项
那么,整个样本集{x,y}的似然函数便是,所有样本出现概率的乘法,即
这个便是我们的最大似然函数,也叫代价函数,我们的目的就是求它的极值。这就回答了最开始的其中一个疑问--
梯度上升算法到底要求哪个函数的极值?
求极值的一般方法就是对函数求导,另导数为0,为了方便求导,先将上式取log,得
将上式对w求导,发现无法求解析解,所以只能自助迭代算法。
3.梯度上升算法
我们的目的是求最大似然函数的最大值,所以这里采用梯度上升算法。梯度的算法为上式对w求导,得
至此,第二个问题也得到解答--这个梯度到底是怎么计算出来的?
这个式子与上面贴出来的三行代码中的第三行中的梯度代码完全对应。
本博客的编写,只为介绍篇首的两个疑问,现在疑问已经解决,博客也该结束了。
第一次写博客,很不专业,欢迎拍砖!但是目的是想让自己把知识重新梳理一下的同时,能帮助更多需要的人,如果有人读完这篇博客,觉得获得了点什么,那么我就
成功了,谢谢!
以后会坚持写博客,咱们后会有期