您的位置:首页 > 编程语言 > Python开发

logistic回归算法详细分析与Python代码实现注释

2017-10-31 19:42 976 查看

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回归算法的特点

优点:计算代价不高,易于理解和实现

缺点:容易欠拟合,分类精确度可能不高

全部代码

在进行分类之前最好可以进行归一化处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息