由图我们可以看出,在处理二分类问题(0,1)时,x=0,f(x) = 0.5,但函数自变量趋近于正无穷时,函数逼近于1。反之,当函数自变量趋近于负无穷时,函数逼近于0。所以对于任意一个输入值,我们总能得出一个在(0,1)之间的输出结果,但输出结果大于0.5时,我们认为输出结果为1,反之为0。因此Logistic回归也可以被看成是一种概率估计。
函数确定之后我们在看一下它的输入情况,我们可以将对条件输入记作:
如果采用向量的写法可以记作:
其中向量x是输入数据,w为输入数据的系数。
所以其实Logistic的训练过程,其实也就是求最优回归系数的过程。
这里我们就需要一个优化算法了,也变引出了——梯度下降(上升)算法
梯度下降(上升)法是一个最优化算法,通常也称为最速下降(上升)法。最速下降(上升)法是求解无约束优化问题最简单和最古老的方法之一,虽然现在已经不具有实用性,但是许多有效算法都是以它为基础进行改进和修正而得到的。最速下降(上升)法是用负(正)梯度方向为搜索方向的,最速下降(上升)法越接近目标值,步长越小,前进越慢。
下面便是梯度下降(上升)算法的经典图示了:
梯度下降(上升)算法的计算公式:
Logistic函数代码:
def sigmoid(inX): return 1.0/(1+exp(-inX))梯度上升算法代码:(因为我们后面需要分类的问题是沿着梯度上升方向寻找的,所以这里使用梯度上升算法)def gradAscent(dataMatIn, classLabels): dataMatrix = mat(dataMatIn) labelMat = mat(classLabels).transpose() m,n = shape(dataMatrix) alpha = 0.001 maxCycles = 500 weights = ones((n,1)) for k in range(maxCycles): h = sigmoid(dataMatrix*weights) error = (labelMat - h) weights = weights + alpha * dataMatrix.transpose()* error #梯度上升算法部分 return weights下面我们需要一些测试数据:图中红色方块代表一种类型的数据,绿色圆圈代表另一种类型的数据。我们尝试使用Logistic回归算法,将这两组数据在这个二维面上划分出来(对于人来说这个工作相当简单。。。)
嗯,看来Logistic回归算法表现的还不错,至少有五岁小朋友的一笔画智商了^_^...
新闻热点
疑难解答