美文网首页
逻辑回归的理解与python示例

逻辑回归的理解与python示例

作者: 笨码农慢慢飞 | 来源:发表于2018-11-06 11:08 被阅读0次

逻辑回归(2018-11-4)

注:根据唐宇迪老师视频总结,如有侵权,请联系本人

一、逻辑回归相关概念

1.1逻辑回归解决的问题

之前一章分析了线性回归的解决方法,是通过误差的高斯分布来推演出的损失函数,但是存在数据样本是否符合分布的问题,在逻辑回归中.使用了sigmoid函数将线性问题转化为非线性的二分类任务,这样的好处是不用考虑误差分布,直接通过变换进行概率求解.

1.2 sigmoid函数

表达式:
g(z)=\frac{1}{1+e^{-z}} \tag{0}

特点:

  • 自变量取值为任意实数,值域[0,1].
  • 将任意的输入映射到[0,1]的区间,物理上可以解释为由值到概率的转换.
sigmiod函数

逻辑回归实现思想:

  • 定义预测函数(将线性函数代入sigmiod函数):
    h_{\theta}(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}} \tag{1}
    其中 \theta_{0}+\theta_{1}x_{1}+,...,\theta_{n}x_{n}=\sum^{n}_{i=1}\theta_{i}x_{i}=\theta^Tx.这里面的\theta_{i}x_{i}就是线性回归问题中的要求得函数.
    预测函数可以看做将函数y=\theta_{i}x_{i}转换到[0,1]区间上,以概率分布的模式表达结果.
    所以在分类任务中,可以假设以下公式成立:

P(y=1|x;\theta)=h_{\theta}(x) \tag{2}
P(y=0|x;\theta)=1-h_{\theta}(x) \tag{3}

将(2),(3)式合并后得到:
P(y|x;\theta)=h_{\theta}(x)^y(1-h_{\theta}(x))^{1-y} \tag{4}

1.3求解过程示例

根据(4)式求得似然函数L(\theta):
L(\theta)=\prod^{m}_{i=1}P(y_{i}|x_{i};\theta)=\prod^{m}_{i=1}h_{\theta}(x_{i})^{y_{i}}(1-h_{\theta}(x_{i}))^{1-y_{i}} \tag{5}

再对(5)式求对数似然,目的是将复杂度较高的乘法替换为简单的加法:
l(\theta)=logL(\theta)=\sum^{m}_{i=1}(y_{i}logh_{\theta}(x_{i})+(1-y _{i})log(1-h_{\theta}(x_{i}))) \tag{6}

  • 由于梯度是上升的,若求l(\theta)为最大值,则可以引入J(\theta)=-\frac{1}{m}l(\theta)转为求梯度下降的任务.自此,就可以通过梯度下降的方法获得近似解了.

求解过程:
l(\theta)=logL(\theta)=\sum^{m}_{i=1}(y_{i}logh_{\theta}(x_{i})+(1-y _{i}log(1-h_{\theta}(x_{i})))

J(\theta)中对\theta_{j}求偏导:
\frac{d}{d\theta_{j}}J(\theta)=-\frac{1}{m}\sum^{m}_{i=1}(y_{i}\frac{1}{h_{\theta}(x_{i})}\frac{d}{d\theta_{j}}h_{\theta}(x_{i})-(1-y_{i})\frac{1}{1-h_{\theta}(x_{i})}\frac{d}{d\theta_{j}}h_{\theta}(x_{i}))\\=-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup\frac{d}{d\theta_{j}}g(\theta^Tx_{i})\tag{7}

下面详细对\frac{d}{d\theta_{j}}g(\theta^Tx)的求导过程做解释:

  • 对于分数类导数,求导公式为:
    (\frac{u}{v})'=\frac{u'v-v'u}{v^2} \tag{9}
  • 由于
    (e^x)'=e^x\tag{9}
    \frac{dy}{dx}= \frac{dy}{du}\cdot\frac{du}{dx}\tag{10}
    所以对g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}求导的过程如下:
    (g(\theta^Tx))'=(\frac{1}{1+e^{-\theta^Tx}})'=\frac{1'\times(1+e^{-\theta^Tx})-(1+e^{-\theta^Tx})'\times1}{(1+e^{-\theta^Tx})^2}\\=\frac{0-(1+e^{-\theta^Tx})'}{(1+e^{-\theta^Tx})^2}=\frac{-1'-(e^{-\theta^Tx})'}{(1+e^{-\theta^Tx})^2}=\frac{-(e^{-\theta^Tx})(-\theta^Tx)'}{(1+e^{-\theta^Tx})^2}\\=(\frac{-(e^{-\theta^Tx})}{(1+e^{-\theta^Tx})^2})(-\theta^Tx)'\\=(\frac{(e^{-\theta^Tx})}{(1+e^{-\theta^Tx})^2})(\theta^Tx)' \tag{11}
    然而
    \frac{(e^{-\theta^Tx})}{(1+e^{-\theta^Tx})^2}=\frac{1+(e^{-\theta^Tx})-1}{(1+e^{-\theta^Tx})^2}=-g(\theta^Tx)^2+g(\theta^Tx)=g(\theta^Tx)(1-g(\theta^Tx)) \tag{12}

所以,结合(7),(11),(12)式,得出下式结论:

-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup\frac{d}{d\theta_{j}}g(\theta^Tx_{i})\\=-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup(\frac{(e^{-\theta^Tx_{i}})}{(1+e^{-\theta^Tx_{i}})^2})(\theta^Tx_{i})'\\=-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup g(\theta^Tx_{i})(1-g(\theta^Tx_{i}))(\theta^Tx_{i})'\\=-\frac{1}{m}\sum^{m}_{i=1}(y_{i}(1-g(\theta^Tx_{i}))-(1-y_{i})g(\theta^Tx_{i}))x_{i}^{j}\\=-\frac{1}{m}\sum^{m}_{i=1}(y_{i}-g(\theta^Tx_{i}))x_{i}^{j}\\=\frac{1}{m}\sum^{m}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j}\tag{13}
其中,x_{i}^{j}=\frac{d}{d\theta_{j}}(\theta^Tx_{i})

公式化简后,就可以使用梯度下降的方法对参数进行迭代更新,最终获得一个最优的\theta
\theta_{j+1}=\theta-\alpha\frac{1}{m}\sum^{m}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j} \tag{14}
其中 \alpha是步长,(13)式的结论是梯度下降的方向,最后求解\theta的最优解.

1.4python实例

数据:考试成绩,每组两门课,如果被录取则标记为1,未录取则为0.
目的:根据已有数据评估新数据是否会被录取.
思想:在已有数据上进行逻辑回归训练,获得理想的\theta值.

数据:

成绩1 成绩2 是否录取
34.623660 78.024693 0
30.286711 43.894998 0
35.847409 72.902198 0
60.182599 86.308552 1
79.032736 75.344376 1

简单起见,只取了代码中的五组数据,仅做示范.

step 1 构造sigmoid函数(根据(0)式)

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

step 2 构造预测函数(根据(1)式)

def model(X, theta):

    return sigmoid(np.dot(X, theta.T))

step 3 构造损失函数(根据(1)式)

def cost(X, y, theta):
    left = np.multiply(-y, np.log(model(X, theta)))
    #print(left.shape)
    right = np.multiply(1 - y, np.log(1 - model(X, theta)))
    #print(right.shape)
    return np.sum(left - right) / (len(X))

step 4 求出\theta的梯度方向(根据(13)式)

def gradient(X, y, theta):
    grad = np.zeros(theta.shape)
    error = (model(X, theta)- y).ravel()
   
    for j in range(len(theta.ravel())): 
        term = np.multiply(error, X[:,j])
        grad[0, j] = np.sum(term) / len(X)
    
    return grad

step 5 运用梯度下降方法求得最优解(根据(14式))

def descent(data, theta,y,thresh,alpha):
    #梯度下降求解
    i = 0 # 迭代次数
    costs = [cost(data, y, theta)] # 损失值

    while True:
        grad = gradient(data, y, theta)
        theta = theta - alpha*grad # 参数更新
        costs.append(cost(data, y, theta)) # 计算新的损失
        i += 1 
        if i>thresh: break  
    return theta, i-1, costs, grad

step6 代入数据,进行运算

data=np.array([[1,34.623660,78.024693],[1,30.286711,43.894998],[1,35.847409,72.902198],
[1,60.182599,86.308552],[1,79.032736,75.344376]])
y=np.array([0,0,0,1,1]).reshape(-1,1)
theta=np.array([[0.5,0.5,0]])
theta, iter, costs, grad= descent(data, theta,y, 100, 0.00001)

相关文章

  • 逻辑回归的理解与python示例

    逻辑回归(2018-11-4) 注:根据唐宇迪老师视频总结,如有侵权,请联系本人 一、逻辑回归相关概念 1.1逻辑...

  • 递归函数

    0. 概念 形式:函数 A 内部,继续调用 函数 A 理解1. 回归起始点2. 每层传递逻辑3. 每层回归值 示例...

  • 逻辑归回

    逻辑回归函数定义 spark代码示例

  • 2018-10-19

    Python与数据挖掘(二)——逻辑回归 逻辑回归一般用来实现分类 一、算法原理 1、预测函数 2、将预测函数的输...

  • 2018-10-20

    Python与数据挖掘(二)——逻辑回归 2、算法实现 import pandas as pdfrom sklea...

  • 逻辑回归的tensorflow示例

    根据代码可以看出tensorflow的运行流程,具体疑问欢迎留言讨论 运行结果:Epoch= 1 cost= 0....

  • 机器学习实战-逻辑回归算法

    关于逻辑回归的理解以及公式推导,可以看前面的文章逻辑回归公式推导 逻辑回归 sigomoid function: ...

  • 案例

    Python实现逻辑回归(Logistic Regression in Python)http://www.pow...

  • RocketMQ DefaultMQPullConsumer

    《RocketMQ实战与原理解析》 DefaultMQPullConsumer的使用 示例代码的处理逻辑是逐个读取...

  • 机器学习之逻辑回归

    逻辑回归 场景简介:使用逻辑回归实现对鸢尾花的分类预测。基于python基本库的实现 模型说明 逻辑回归是一个分类...

网友评论

      本文标题:逻辑回归的理解与python示例

      本文链接:https://www.haomeiwen.com/subject/dxgyxqtx.html