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

logistic回归是线性回归算法的一种。

线性模型

基本结构为
f(x)=w0+w1x1+...+wnxn=wTx
其中 wi 是每个特征的参数。
当我们知道了w向量的值之后,我们就可以根据给定的x向量来计算f(x),给出预测结果。

损失函数

我们采用平方损失函数作为我们训练的损失函数
J(w)=12m1(yifw(xi)2
1/2是为了在后边求偏导数的时候用到

梯度下降

在进行预测的时候目标就是损失函数最小,是用梯度上升或者梯度下降的方式来进行最优化求解。其基本思想是:要找到某函数的最大/小值,最好的方式就是沿着函数上升或者下降的梯度方向探寻。也就是我们说的导数。对 J(w) 进行求偏导之后得到的结果为
J(w)wj=(hw(x)y)xj
可以看出对 wj 求偏导只依赖于 xj
根据求得到导数我们就有了该点下降速度最快的方向,向该方向移动
于是我们更新参数向量
wj:=wj+α(yifw(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+ez
该函数的特点是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回归算法的特点

  • 优点:计算代价不高,易于理解和实现
  • 缺点:容易欠拟合,分类精确度可能不高

全部代码
在进行分类之前最好可以进行归一化处理

猜你喜欢

转载自blog.csdn.net/yin_hei/article/details/78407081