数据挖掘算法(三)--logistic回归

来源:互联网 发布:火山软件开发平台 编辑:程序博客网 时间:2024/05/22 08:02

数据挖掘算法学习笔记汇总
数据挖掘算法(一)–K近邻算法 (KNN)
数据挖掘算法(二)–决策树
数据挖掘算法(三)–logistic回归

在介绍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+ek(xx0)

其中

  • e自然对数
  • x0 S形中点的x值
  • L曲线的 最大值
  • k曲线的陡度
    这里写图片描述
    上图是L=1,k=1,x0=0时的图像
    这里主要说明下这个函数的导数的性质,后面推导的时候会用到。
    f(x)=11+ex=ex1+ex

    ddxf(x)=ex(1+ex)exex(1+ex)2

    ddxf(x)=ex(1+ex)2=f(x)(1f(x))

logistic回归数学推导

先看一个简单的例子:
这里写图片描述
我们将平面上的点分为两类,中间的红色线条为边界。
预测类别y=1 如果3+x1+x20预测类别y=0 如果3+x1+x2<0
此例子中

hθ(x)=g(θ0+θ1x1+θ2x2)

对更多维的数据进行分类时,线性边界的情况,边界形式如下:

θ1x1+θ2x2+...+θnxn=θTx

根据logistic回归可知预测函数为:
hθ(x(i)=g(θTxi)=11+eθTxi

hθ(x(i)函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
P(y=1|x;θ)=hθ(x(i)

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

合起来写则可以得到下式:
P(y|xθ)=(hθ(x))y(1hθ(x))1y

取似然函数得到下式:
L(θ)=i=1mP(y(i)|x(i),θ)

求自然对数得到对数似然函数:
l(θ)=lnL(θ)

=i=1m(y(i)lnhθ(x(i))+(1y(i))ln(1hθ(x(i))))

最大似然估计就是要求得使l(θ)取最大值时的θ,利用梯度上升法求解,求得的θ就是要求的最佳参数。下面是利用梯度上升法求解过程。
求利用梯度上升法求解l(θ)的最大值时,根据梯度上升法知道θ的更新公式如下:
θj:=θj+αθjl(θ)    (j=0...n)

下面先求出l(θ)的偏导数:
θjl(θ)=i=1m((y(i)1hθ(x(i))θjhθ(x(i))(1y(i))11hθ(x(i))θjhθ(x(i))

=i=1m((y(i)1g(θTx(i))(1y(i))11g(θTx(i)))θjg(θTx(i))

因为g(θTxi)是logistic函数

g(θTxi)=11+eθTxi

所以我们利用前面讲的logistic函数的导数性质可以将l(θ)的偏导数转化
θjl(θ)=i=1m((y(i)1g(θTx(i))(1y(i))11g(θTx(i)))g(θTx(i))(1g(θTx(i)))θjθTx(i)

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

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

=i=1m(y(i)hθ(x(i)))x(i)j

这样就得到了更新的过程

θj:=θj+αi=1m(y(i)hθ(x(i)))x(i)j    (j=0...n)

python代码实现

本文代码运行环境:
python:3.5.1
pandas:0.19.2
其他环境可能有细微差别

# -*coding:utf-8*-import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport 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 thetasdef 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

参考资料

1、https://en.wikipedia.org/wiki/Maximum_likelihood_estimation
2、https://en.wikipedia.org/wiki/Logistic_function

欢迎python爱好者加入:学习交流群 667279387

原创粉丝点击