Logistic回归简介及python代码实现

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 np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from 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 , 样本在分界线的下方。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值