Logistic Regression 逻辑回归公式推导和Python代码实现

Logistic Regression 逻辑回归公式推导和Python代码实现

概述

对于二分类问题通常都会使用逻辑回归,逻辑回归虽然占了回归这两个字但是它确是一个非常流行的分类模型,后面的很多算法都是从逻辑回归延伸出来的。下面我们来推导一下线性逻辑回归模型。

公式推导

假设在给定一个人的身体状况等参数情况下预测一个人生病的概率,特征向量X(x0,x1,x2…xn) 表示这个人的身体状况,预测量y等于0或1,0表示不会生病,1表示会生病。那么这个人会生病的概率可以表示为:
f ( x ) = p ( y = 1 ∣ X ) f(x)=p(y=1|X) f(x)=p(y=1X)
反过来这个人不会生病的概率就是:
1 − f ( x ) 1-f(x) 1f(x)
上述概率是服从伯努利概率分布的,也就是0-1分布,可以将概率表示为:
p ( y ∣ X ) = f ( x ) y ( 1 − f ( x ) ) 1 − y p(y|X)=f(x)^y(1-f(x))^{1-y} p(yX)=f(x)y(1f(x))1y
此时,我们需要得到的目标参数就变成了对 f(x) 的估计,采用最大似然估计法(假设样本空间具有N个数据):
a r g m a x ∏ i = 1 N ( f ( x i ) y i ( 1 − f ( x i ) ) ( 1 − y i ) ) argmax ∏_{i=1}^N(f(x_i)^{y_i}(1-f(x_i))^{(1-y_i)}) argmaxi=1N(f(xi)yi(1f(xi))(1yi))
虽然这个目标函数是写出来了,但是现在有一个问题,在实际中很难得到f(x)的数值,在样本数据中只有0和1的概率,所以需要对f(x)进行建模。首先有一点可以确定f(x)是特征向量X的函数,将特征向量乘上权重可以得到:
s = W T X s=W^TX s=WTX
f(x)可以表示为f(s),最后为了表示0-1分布的概率特性,采用了sigmoid函数进行模型,最终转化为:
f ( x ) = 1 / ( 1 − e x p ( W T X ) ) f(x)=1/(1-exp(W^TX)) f(x)=1/(1exp(WTX))
有了f(x)的模型后,我们继续对目标函数进行处理,首先我们将连乘转化为求和:
a r g m a x ∑ i = 1 N ( y i l n ( f ( x i ) + ( 1 − y i ) l n ( 1 − f ( x i ) ) ) argmax \sum_{i=1}^N(y_iln(f(x_i)+(1-y_i)ln(1-f(x_i))) argmaxi=1N(yiln(f(xi)+(1yi)ln(1f(xi)))
进一步转化得到:
a r g m a x ∑ i = 1 N ( y i l n ( f ( x i ) / ( 1 − f ( x i ) ) + l n ( 1 − f ( x i ) ) ) argmax \sum_{i=1}^N(y_iln(f(x_i)/(1-f(x_i))+ln(1-f(x_i))) argmaxi=1N(yiln(f(xi)/(1f(xi))+ln(1f(xi)))
将sigmoid函数带入上式:
a r g m a x ∑ i = 1 N ( y i W T X i − W T X i − l n ( 1 + e x p ( − W T X i ) ) ) argmax \sum_{i=1}^N(y_iW^TX_i-W^TX_i-ln(1+exp(-W^TX_i))) argmaxi=1N(yiWTXiWTXiln(1+exp(WTXi)))
自此我们就只需要采用优化算法求解使得目标函数最大的WT就可以了。

代码

import numpy as np

#sigmoid函数
def sigmoid(Num):
    """sigmoid函数
    input:Num(Mat):feature * W
    Output:sigmoid(Num)(Mat):sigmoid值
    """
    return 1.0/(1+exp(-Num))

def error_rate(h,label):
    """计算当前的损失函数(交叉熵)
    input:h(Mat):--------->预测值
          label(Mat):----->实际值
    output:err/m(float):-->错误率
    """
    m=np.shape(h)[0]#目标个数
    sum_err=0.0
    for i in xrange(m):
        if h[i,0]>0 and (1-h[i,0])>0:
            sum_err-=(label[i,0]*np.log(label[i,0])+(1-label[i,0]*np.log(1-h[i,0])))
        else:
            sum_err-=0
    return sum_err/m

def lr_train_bgd(feature,label,maxCycle,alpha):
    """利用梯度下降法训练LR模型
    input:feature(Mat)---->特征(n*1)
          label(Mat)------>标签
          maxCycle(int)--->最大迭代次数
          alpha(float)---->学习率
    """
    n=np.shape(feature)[1]#通过使用np的.shape函数得到特征个数
    W=np.mat(np.ones((n,1)))#初始化权重(n*1)
    i=0
    while i<=maxCycle:
        i+=1
        h=sigmoid(feature*W)
        err=label-h
        if i%100==0:
            print("\t-------iter="+str(i)+",train error rate="+str(error_rate(h,label)))
        W=W+alpha*feature.T*err#权重修正,需要转秩,所以输入为np数据类型
    return W

该代码参考了《Python 机器学习算法》,采用梯度下降法进行的优化。

总结

逻辑回归是一个很有用的二分类模型,使用核函数的方法可以进行非线性分类分析,此外它和SVM经常会联合在一起使用。
文章只是自己的一些理解,仅供参考,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值