数据挖掘算法(三)--logistic回归
数据挖掘算法学习笔记汇总数据挖掘算法(一)–K近邻算法 (KNN)数据挖掘算法(二)–决策树数据挖掘算法(三)–logistic回归在介绍logistic回归之前先复习几个基础知识点,有助于后面的理解。基本数学知识点1、对数似然函数若总体X为离散型,其概率分布列为 P(X=x)=p(x,θ) P(X=x)=p(x,\theta)其中θ\theta为未知参数。设 (X1,X2,...,
数据挖掘算法学习笔记汇总
数据挖掘算法(一)–K近邻算法 (KNN)
数据挖掘算法(二)–决策树
数据挖掘算法(三)–logistic回归
在介绍logistic回归之前先复习几个基础知识点,有助于后面的理解。
基本数学知识点
1、对数似然函数
若总体X为离散型,其概率分布列为
又设 (X1,X2,...,Xn) <script type="math/tex" id="MathJax-Element-6"> (X_1,X_2,...,X_n) </script>的一组观测值为 (x1,x2,...,xn) <script type="math/tex" id="MathJax-Element-7"> (x_1,x_2,...,x_n) </script>,易知样本 X1,X2,...,Xn <script type="math/tex" id="MathJax-Element-8"> X_1,X_2,...,X_n </script>取到观测值 x1,x2,...,xn <script type="math/tex" id="MathJax-Element-9"> x_1,x_2,...,x_n </script> 的概率为
2、logistic函数
logistic函数或logistic曲线是常见的“S”形(sigmoid curve ,S形曲线),方程式如下:
其中
- e <script type="math/tex" id="MathJax-Element-17">e</script>自然对数
x0 <script type="math/tex" id="MathJax-Element-18">x_0</script> S形中点的x值- L <script type="math/tex" id="MathJax-Element-19">L</script>曲线的 最大值
k <script type="math/tex" id="MathJax-Element-20">k</script>曲线的陡度
上图是 L=1,k=1,x0=0 <script type="math/tex" id="MathJax-Element-21">L=1,k=1,x_0=0</script>时的图像
这里主要说明下这个函数的导数的性质,后面推导的时候会用到。
f(x)=11+e−x=ex1+ex<script type="math/tex; mode=display" id="MathJax-Element-22">f(x)=\frac{1}{1+e^{-x}}=\frac{e^{x}}{1+e^{x}}</script>
ddxf(x)=ex(1+ex)−exex(1+ex)2<script type="math/tex; mode=display" id="MathJax-Element-23">\frac{d}{dx}f(x)=\frac{e^{x} (1+e^{x})-e^{x} e^{x}}{(1+e^{x})^2}</script>
ddxf(x)=ex(1+ex)2=f(x)(1−f(x))<script type="math/tex; mode=display" id="MathJax-Element-24">\frac{d}{dx}f(x)=\frac{e^{x}}{(1+e^{x})^2}=f(x)(1-f(x))</script>
logistic回归数学推导
先看一个简单的例子:
我们将平面上的点分为两类,中间的红色线条为边界。
预测类别 y=1 <script type="math/tex" id="MathJax-Element-25">y=1</script> 如果 −3+x1+x2≥0 <script type="math/tex" id="MathJax-Element-26">-3+x_1+x_2\geq0</script>预测类别 y=0 <script type="math/tex" id="MathJax-Element-27">y=0</script> 如果 −3+x1+x2<0 <script type="math/tex" id="MathJax-Element-28">-3+x_1+x_2 < 0</script>
此例子中
对更多维的数据进行分类时,线性边界的情况,边界形式如下:
根据logistic回归可知预测函数为:
hθ(x(i) <script type="math/tex" id="MathJax-Element-32">h_{\theta}(x^{(i)}</script>函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
合起来写则可以得到下式:
取似然函数得到下式:
求自然对数得到对数似然函数:
最大似然估计就是要求得使 l(θ) <script type="math/tex" id="MathJax-Element-39">l(\theta)</script>取最大值时的 θ <script type="math/tex" id="MathJax-Element-40">\theta</script>,利用梯度上升法求解,求得的 θ <script type="math/tex" id="MathJax-Element-41">\theta</script>就是要求的最佳参数。下面是利用梯度上升法求解过程。
求利用梯度上升法求解 l(θ) <script type="math/tex" id="MathJax-Element-42">l(\theta)</script>的最大值时,根据梯度上升法知道 θ <script type="math/tex" id="MathJax-Element-43">\theta</script>的更新公式如下:
下面先求出 l(θ) <script type="math/tex" id="MathJax-Element-45">l(\theta)</script>的偏导数:
因为 g(θTxi) <script type="math/tex" id="MathJax-Element-48">g(\theta^Tx^{i})</script>是logistic函数
所以我们利用前面讲的logistic函数的导数性质可以将 l(θ) <script type="math/tex" id="MathJax-Element-50">l(\theta)</script>的偏导数转化
这样就得到了更新的过程
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
参考资料
1、https://en.wikipedia.org/wiki/Maximum_likelihood_estimation
2、https://en.wikipedia.org/wiki/Logistic_function
欢迎python爱好者加入:学习交流群 667279387
更多推荐
所有评论(0)