logistic回归是线性回归算法的一种。
线性模型
基本结构为
f(x)=w0+w1∗x1+...+wn∗xn=wTx
其中
wi
是每个特征的参数。
当我们知道了w向量的值之后,我们就可以根据给定的x向量来计算f(x),给出预测结果。
损失函数
我们采用平方损失函数作为我们训练的损失函数
J(w)=12∑m1(yi−fw(xi)2
1/2是为了在后边求偏导数的时候用到
梯度下降
在进行预测的时候目标就是损失函数最小,是用梯度上升或者梯度下降的方式来进行最优化求解。其基本思想是:要找到某函数的最大/小值,最好的方式就是沿着函数上升或者下降的梯度方向探寻。也就是我们说的导数。对
J(w)
进行求偏导之后得到的结果为
∂J(w)∂wj=(hw(x)−y)xj
可以看出对
wj
求偏导只依赖于
xj
根据求得到导数我们就有了该点下降速度最快的方向,向该方向移动
于是我们更新参数向量
wj:=wj+α(yi−fw(xi))xij
上标表示行,下标表示列
于是我们有梯度下降的Python代码
def gradAscent(dataMatIn,classLabels):
dataMatrix=mat(dataMatIn)
labelMat=mat(classLabels).transpose()
#将行向量转置为列向量
#transpose()是对矩阵尽心转置
#mat的作用是讲numpy的2维数组装换为矩阵
m,n=shape(dataMatrix)
#这里m为行的数量,n为列的数量,这里是三
alpha=0.001
#alpha表示向目标移动的步长
maxCycles=500
#maxcycles表示迭代次数
weights=ones((n,1))
#weights初始化为n行一列的列向量
for k in range(maxCycles):
h=sigmoid(dataMatrix*weights)
#矩阵运算得到一个列向量,就是在当前参数情况下的分类结果
error=(labelMat-h)
#计算y-label
weights=weights+alpha*dataMatrix.transpose()*error
return weights
梯度下降算法优化
梯度下降需要把所有权重参数一次性计算完毕,然而每个参数的收敛速度可能是不一样的,有些参数在计算的而中间可能已经收敛了,所有可以使用随机梯度下降的方式python代码
def stocGradAscent1(dataMatrix,classLabels,numIter=150):
m,n=shape(dataMatrix)
weight=ones(n)
for j in range(numIter):
dataIndex=range(m)
for i in range(m):
alpha=4/(1.0+j+i)+0.01
#alpha有了改进
randIndex=int(random.uniform(1,len(dataIndex)))
#从测试数据中随机选取一个测试数据
h=sigmoid(sum(dataMatrix[randIndex]*weight))
error=classLabels[randIndex]-h
weight=weight+alpha*error*dataMatrix[randIndex]
del(dataIndex[randIndex])
return weight
logistic回归是一种分类算法,利用sigmoid函数记性分类函数原型为
S=11+e−z
该函数的特点是x的取值范围为
(−∞,+∞)
,函数值范围为(0,1)
我们是用f(x)作为z就可以利用梯度或者上升的方式找到一个最合适的参数向量w得到预测函数f(x)然后利用sigmoid函数进行分类。
分类代码
def classifyVector(inx,weights):
prob=sigmoid(sum(inx*weights))
if prob>0.5:
return 1.0
else:
return 0.0
logistic回归算法的特点
- 优点:计算代价不高,易于理解和实现
- 缺点:容易欠拟合,分类精确度可能不高
全部代码
在进行分类之前最好可以进行归一化处理