Logistic回归简介及python代码实现

来源:互联网 发布:网络小贷 编辑:程序博客网 时间:2024/05/16 19:48

1、Sigmoid 函数:

hθ(x)=g(θTx)=11+eθTx

g(z)=11+exp(z)

g(z)=(11+exp(z))=exp(z)(1+exp(z))2=11+exp(z)(exp(z)1+exp(z))=g(z)(1g(z))

这里写图片描述

2、二项 Logistic 回归模型

二项分布 Logistic 回归模型是满足如下的条件概率分布:

P(y=1|x)=exp(wx+b)1+exp(wx+b)

P(y=0|x)=11+exp(wx+b)

我们可以写为如下的形式:

P(y=1|x;θ)=hθ(x)=11+eθTx

P(y=0|x;θ)=1hθ(x)

这里,x0=1

3、损失函数

似然函数是:

L(θ)=i=1NP(y(i)|x(i);θ)=iN(hθ(x(i)))y(i)(1hθ(x(i)))1y(i)

对似然函数取对数:

l(θ)=log(L(θ))=i=1Ny(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))

对对数似然求极大值:

l(θ)θj=i=1N(y(i)hθ(x(i))1y(i)1hθ(x(i)))hθ(x(i))θj

= i=1N(y(i)g(θTx(i))1y(i)1g(θTx(i)))g(θTx(i))θj

=i=1N(y(i)g(θTx(i))1y(i)1g(θTx(i)))g(θTx(i))(1g(θTx(i)))θTx(i)θj

=i=1N(y(i)(1g(θTx(i)))(1y(i))g(θTx(i)))x(i)j

= i=1N(y(i)g(θTx(i)))x(i)j

取损失函数 loss=L(θ), 对似然函数取极大值,既是损失取得最小值,

loss(θ)θjiN(y(i)g(θTx(i)))x(i)j

使用随机梯度下降算法:这里和线性回归的形式有些不同。线性回归中,似然函数取最大值时,损失函数(均方误差)需要取最小值才满足要求,使用随机梯度下降法。而在 Logistic 回归中,损失函数是似然函数的相反数,使用随机梯度上升法,更新公式中是加号。

参数优化公式:

θj=θj+α(y(i)hθ(x))x(i)j

#-*- coding:utf-8 -*-from numpy import *import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltfrom math import *def calSigmod(theta,inX):    return 1.0/(1+exp(-1*(theta*inX)))if __name__=="__main__":    print "hello world"    data = pd.read_csv("testSet.txt",delimiter='\t',header=None)    m, n = shape(data)            # data 的数据类型是:pandas.core.frame.DataFrame,按data[j] 是按列输出; data[i][j]  按照元素输出    print m,n    x = mat(ones((n,m)))       # x 是 m 行 n 列的矩阵,按行输出为 x[j], 按列输出为 x[:,j],按照单个元素输出为 x[i,j]    x[1] = data[0]    x[2] = data[1]    y = data[[2]]    y = mat(y)    theta = mat(zeros((1,n)))    a = 0.001           # 步长,学习率    # 使用随机梯度下降优化参数    for i in range(1000):        for j in range(m):            hx =  calSigmod(theta,x[:,j]) - y[j]            theta = theta - a*hx*x[:,j].T            # theta[0,0] = theta[0,0] + a*hx*x[0,j]            # theta[0,1] = theta[0,1] + a*hx*x[1,j]            # theta[0,2] = theta[0,2] + a*hx*x[2,j]    print theta    # 根据求到的参数theta,计算分界面    x1 = arange(-5,5,0.1)    x2 = (-1*theta[0,0] - theta[0,1]*x1)/theta[0,2]    # 根据标签,对样本点做标记,便于观察    x1_record = []; y1_record =[]    x2_record = []; y2_record =[]    for i in range(m):        if y[i]==1:            x1_record.append(x[1,i])            y1_record.append(x[2,i])        else:            x2_record.append(x[1,i])            y2_record.append(x[2,i])    # 画图    mpl.rcParams['font.sans-serif'] = [u'simHei']    mpl.rcParams['axes.unicode_minus'] = False            # 在图中加入汉字需要    fig = plt.figure()    ax = fig.add_subplot(111)    ax.scatter(x1_record,y1_record,s=20,c='red')    ax.scatter(x2_record,y2_record,s=30,c='green')    ax.plot(x1,x2,'b-')    plt.xlabel(u'特征1',fontsize=15)    plt.ylabel(u'特征2',fontsize=15)    plt.show()

图2

一个事件的几率(odds): 指该事件发生的概率(P)和该事件不发生的概率(1-P)的比值。即:P1P.
事件的对数几率(log odds)或者logit 是: logit(P)=logP1P .

对 Logistic 回归,logP(y=1|x;θ)1P(y=1|x;θ)=θTx.

也就是说,在 Logistic回归模型中,输出y=1 的对数几率是输入x 的线性函数。

对图2,
P(y=1|x;θ)>0.5 时,θTx>0, 样本在分界线的上方;
P(y=1|x;θ)<0.5 时, θTx<0, 样本在分界线的下方。

参考:
《统计学习方法》 李航
《机器学习实战》

原创粉丝点击