在介绍logistic回归之前先复习几个基础知识点,有助于后面的理解。
基本数学知识点
1、对数似然函数
若总体X为离散型,其概率分布列为
P(X=x)=p(x,θ)
其中
θ为未知参数。设
(X1,X2,...,Xn) 是取自总体样本容量为n的样本,则
(X1,X2,...,Xn)的联合概率分布率为
∏i=1np(xi,θ)
又设
(X1,X2,...,Xn)的一组观测值为
(x1,x2,...,xn),易知样本
X1,X2,...,Xn取到观测值
x1,x2,...,xn 的概率为
L(θ)=L(x1,x2,...,xn;θ)=∏i=1np(xi,θ)
这一概率随
θ 的取值而变化,它是
θ 的函数,称
L(θ) 为样本的似然函数。但是由于来连乘的函数处理起来比较麻烦,所以对
L(θ) 取自然对数变成加法来处理要简单点。
lnL(θ)=∑i=1nlnp(xi,θ)
2、logistic函数
logistic函数或logistic曲线是常见的“S”形(sigmoid curve ,S形曲线),方程式如下:
f(x)=L1+e−k(x−x0)
其中
- e自然对数
- x0
- L曲线的 最大值
- k曲线的陡度
上图是L=1,k=1,x0=0时的图像
这里主要说明下这个函数的导数的性质,后面推导的时候会用到。
f(x)=11+e−x=ex1+ex
ddxf(x)=ex(1+ex)−exex(1+ex)2
ddxf(x)=ex(1+ex)2=f(x)(1−f(x))
logistic回归数学推导
先看一个简单的例子:
我们将平面上的点分为两类,中间的红色线条为边界。
预测类别y=1 如果−3+x1+x2≥0预测类别y=0 如果−3+x1+x2<0
此例子中
hθ(x)=g(θ0+θ1x1+θ2x2)
对更多维的数据进行分类时,线性边界的情况,边界形式如下:
根据logistic回归可知预测函数为:
hθ(x(i)函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
合起来写则可以得到下式:
取似然函数得到下式:
求自然对数得到对数似然函数:
最大似然估计就是要求得使
l(θ)取最大值时的
θ,利用梯度上升法求解,求得的
θ就是要求的最佳参数。下面是利用梯度上升法求解过程。
求利用梯度上升法求解
l(θ)的最大值时,根据梯度上升法知道
θ的更新公式如下:
下面先求出
l(θ)的偏导数:
因为g(θTxi)是logistic函数
所以我们利用前面讲的logistic函数的导数性质可以将
l(θ)的偏导数转化
这样就得到了更新的过程
python代码实现
本文代码运行环境:
python:3.5.1
pandas:0.19.2
其他环境可能有细微差别
# -*coding:utf-8*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
# 获取数据
data = pd.read_table("./logistic.txt", sep="\t", header=None)
dataMat = data.iloc[:, 0:-1]
labelMat = data.iloc[:, -1]
def sigmoid(dataSeries):
return 1.0 / (1 + np.exp(-dataSeries))
# 梯度上升算法
def gradAscent(dataMatrix, LabelsVector):
n = dataMatrix.shape[1]
alpha = 0.001
maxCycles = 500
thetas = np.ones((n, 1))
for k in range(maxCycles): # heavy on matrix operations
h = sigmoid(dataMatrix * thetas) # matrix mult
error = LabelsVector.T - h # vector subtraction
thetas = thetas + alpha * dataMatrix.T * error # matrix mult
return thetas
def plotBestFit(thetas, data):
"""
:param thetas: type DataFrame , the thetas
:param data: type DtaFrame , all the data
:return:
"""
X1 = data[data[3] == 0]
X2 = data[data[3] == 1]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(X1[1], X1[2], s=30, c='red', marker='s')
ax.scatter(X2[1], X2[2], s=30, c='green')
x = np.arange(-3.0, 3.0, 0.1)
y = (-thetas.iloc[0, 0] - thetas.iloc[1, 0] * x) / thetas.iloc[2, 0]
ax.plot(x, y)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
thetas = gradAscent(np.mat(dataMat), np.mat(labelMat))
plotBestFit(pd.DataFrame(thetas), data)
画出的图如下所示:
代码和数据下载地址:链接:http://pan.baidu.com/s/1hs6CKL2 密码:308l