logistic回归
假设现在有一些数据点,需要用一条直线对这些数据点进行拟合,该过程就叫做回归。
logistic回归主要用来解决二分类预测问题,例如判断一张图片是否是猫,一个人是否患有相关疾病等。所以logistic回归的输出值是一个介于0~1之间的概率值。如果用普通的线性函数Y=WX+b,Y的大小是跟随X的变化会线性的增加或缩小,不满足概率值的条件。
所以此时可以借助sigmoid函数对其进行转化,转化后为,其图像是:
sigmoid函数拥有良好性质:值域(0,1);单调可微;x=0附近变化很陡。对于给定的(x1,y1),(x2,y2)........想让通过sigmoid函数通过xi得到的预测值y^i尽可能的和yi相似,这时需要一个损失函数L来衡量预测值y^i和实际值yi有多接近。在logistic回归中通常使用函数来作为损失函数。在线性回归中一般使用最小二乘法。至于为什么要选择这个函数,下图可以稍微解释,具体的原因可以去看吴恩达的网易云公开课第二周第三节。
该损失函数仅代表了单个样本的损失函数,整体样本的损失值可以定义一个成本函数J:
梯度下降算法
接下来需要做的就是确定w和b的参数值,来使成本函数最小,这里可以使用梯度下降法来进行求解。
用一个二维的例子来解析梯度下降法是如何确定参数值时成本函数最小:
如图,横轴代表w,数轴是J,我们通过不断让w的值进行迭代来使J达到最小值,迭代式子为:
其中α是学习率,是由自己定义的一个数值。右图可知,当J是递减是,是小于0的,此时进行迭代,w的值会不断增大,进而J的值会不断减小,进而到最小值;当J是递增是,
是大于0的,此时进行迭代,w的值会不断减小,J的值也会不断减小。
当参数个数增加拓展到高维时,该规律依旧成立。
通过不断迭代w和b的值进而让J到达谷底。
logistic回归中的梯度下降算法
之前总结的logistic公式是:
a是logistic回归得输出,y是样本值的真值。
假设样本只有x1和x2两个特征值,为了计算Z,要输入w和b,因此该正向传播过程是为:
通过对w1,w2,b的值进行变化,来试损失函数达到最小值。现在我们根据上面的过程来讨论如何向后计算偏导数,也就是计算出dw1,dw2,db,进而通过公式使w1,w2,b进行迭代。
这里通过反向传播的计算方式来进行偏导数的计算:
首先由L向前传播计算出L对a的导数da,;
之后再向前一步计算L对z的导数dz,
现在进行向后传播的最后一步,可以知道w1,w2和b该如何变化,损失函数L对于w1的偏导数dw1是;同理dw2是
;db是
。
所以,综上可知,对于单个样本的梯度下降法,需要做的是使用这个计算公式计算dz,然后计算dw1、dw2、db,然后来对w1,w2,b进行更新。
更新w1为w1减去学习率乘以dw1:;
更新w2为w2减去学习率乘以dw2:;
更新b为b减去学习率乘以db:;
这就是单个样本中梯度下降算法的一次更新步骤。但是训练logistic回归模型,不仅仅只有一个训练样本,而是有m个训练样本的整个训练集。
m个样本的梯度下降
上面说明了梯度下降在logistic回归单个样本上的应用,接下来会介绍当样本个数为m个时,梯度下降算法的具体计算过程。
首先,有关于整体样本损失函数J(w,b) 的定义为:
a(i)是训练样本通过logistic回归得到的预测值,即a(i)=y^(i)=
当计算整体样本损失函数对w1的导数时,结果为:,同时也是各项损失函数对w1导数的平均值,之前我们已经演示了如何计算dw1(i)这项,即如何对单个训练样本进行计算。
所以真正需要做的是计算这些微分,如之前的训练样本上做的,并且求平均,这会得到全局梯度值,就能够把它直接应用到梯度下降算法中。
初始化 J=0,dw_1=0,dw_2=0,db=0
上图中的db,dw1,dw2是作为一个累加器,最后会求出它们的平均值,也就是整体样本的损失函数对w1,w2,b的导数,然后将其应用到梯度下降中的一次迭代。
笔记上只应用了一步梯度下降。因此我们需要重复以上内容很多次,以应用多次梯度下降。看起来这些细节似乎很复杂,但目前不要担心太多。
但这种计算中有两个缺点,也就是说应用此方法在逻辑回归上你需要编写两个for循环。
第一个for循环是一个小循环遍历m个训练样本,
第二个for循环是一个遍历所有特征的for循环。
这个例子中我们只有2个特征,所以n等于2并且n_x 等于2。 但如果有更多特征w1,w2....wn,这就需要一个for循环遍历所有n个特征。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
附上用tensorflow实现logistic回归的代码
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对于在梯度下降中如何判断输出结果已经是最小值,我的想法是再进行了多步迭代之后,使损失函数J(i)和J(i-1)相减,如果差是一个很小的可以忽略的数值,那么说明不需要再继续迭代了。