• 逻辑斯蒂回归模型


    http://blog.csdn.net/hechenghai/article/details/46817031

    主要参照统计学习方法、机器学习实战来学习。下文作为参考。

    第一节中说了,logistic 回归和线性回归的区别是:线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y‘的误差来求得模型参数。我们看到这里的模型的值Y是样本X各个维度的Xi的线性叠加,是线性的。

    Y=WX (假设W>0),Y的大小是随着X各个维度的叠加和的大小线性增加的,如图(x为了方便取1维):

    bubuko.com,布布扣

    然后再来看看我们这里的logistic 回归模型,模型公式是:bubuko.com,布布扣,这里假设W>0,Y与X各维度叠加和(这里都是线性叠加W)的图形关系,如图(x为了方便取1维):

    bubuko.com,布布扣

    我们看到Y的值大小不是随X叠加和的大小线性的变化了,而是一种平滑的变化,这种变化在x的叠加和为0附近的时候变化的很快,而在很大很大或很小很小的时候,X叠加和再大或再小,Y值的变化几乎就已经很小了。当X各维度叠加和取无穷大的时候,Y趋近于1,当X各维度叠加和取无穷小的时候,Y趋近于0.

    这种变量与因变量的变化形式就叫做logistic变化。(注意不是说X各个维度和为无穷大的时候,Y值就趋近1,这是在基于W>0的基础上,(如果W<0,n那么Y趋近于0)而W是根据样本训练出来,可能是大于0,也可能是小0,还可能W1>0,W2<0…所以这个w值是样本自动训练出来的,也因此不是说你只要x1,x2,x3…各个维度都很大,那么Y值就趋近于1,这是错误的。凭直觉想一下也不对,因为你连样本都还没训练,你的模型就有一个特点:X很大的时候Y就很大。这种强假设肯定是不对的。因为可能样本的特点是X很大的时候Y就很小。)

    所以我们看到,在logistic回归中,X各维度叠加和(或X各维度)与Y不是线性关系,而是logistic关系。而在线性回归中,X各维度叠加和就是Y,也就是Y与X就是线性的了。

    X各维度叠加和Y的关系不只是这一种,还可能是其他的比如:

    bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣

    为什么变量与因变量要选用logistic关系呢,因为这里(1)我们需要Y代表的是概率即Y∈(0,1)。(2)我们需要X各维度叠加和在0附近变化幅度比较大,并且是非线性的变化。而在很大或很小的时候,几乎不变化,这是基于概率的一种认识与需要。感性的一个例子,想想你学习努力的程度与从60分提高到80分和80提高到100分并不是线性的。(3)这个关系的公式要在之后形成的cost function是凸函数。

    所以就选择了logistic。

    前面已经说了,我们使用logistic回归是用于二分类问题(y只有两个值A,B,也可以写成1和0,这都没关系),回归模型得到的结果不是预测样本X对应的y值(注意下,在logistic回归这里我们小写y表示某个样本Xi的类别,而大写Y或Y(Xi)表示logistic回归模型对某个样本Xi预测为1的概率。其实这里最好把Y用其他字母表示,以免混淆,但是已经这里写了,以后注意。),而是y=1的概率或y=0的概率。我们假设y=1的概率公式是:bubuko.com,布布扣,那么y=0的概率就是bubuko.com,布布扣。(注意我们也可以y=0的概率公式为前面那一个,这里是任意的。这里不同的结果只是最终的W参数不同罢了。因为我们最终的W是训练出来的,不管怎么样,模型都会表现出样本的特点来。只是我们习惯了把Y(X)当成y=1的logistic模型映射的概率)

    还要注意这里我们不是对一个Xi都要分别预测出来y=1的概率和y=0的概率。而是对于一个Xi,如果它的yi=1,那么我们就用bubuko.com,布布扣这个公式映射所对应的概率,如果对于一个Xi,如果它的yi=0,那么我们就用bubuko.com,布布扣这个公式映射所对应的概率。都是根据yi的值映射出来一个概率。

    因为我们的Y是概率,我们不能利用最小误差等,我们这里用的是极大化所有样本的对数似然函数:bubuko.com,布布扣

    yi表示的是Xi真实所属的类别(1或0)。L(W)就是cost function。这里的目标函数值和W有关系,也就是X各维度线性叠加的那些权重有关系。

    那么这些权重的物理意义是什么呢?就是X各维度与Y值关系的那个方向,听起来可能很抽象,现在看一下具体例子(X为二维,但考虑将常数项变成齐次后X就是三维了,第一维是1,因此W也是三维的,第一维是常数项,大小不影响那个方向,主要考虑后面的两个值的关系),比如:

    当W=[-15 0.2 0.2],图形为:(一种45°方向的关系)

    bubuko.com,布布扣

    当W=[-15 -0.2 -0.2],图形为:(一种-45°方向的关系)

    bubuko.com,布布扣

    当W=[-15 0.2 0.01],图形为:(一种0°方向(沿x轴形成的logistic关系)的关系)

    bubuko.com,布布扣

    当W=[-15 0.01 0.2],图形为:(一种90°方向(沿y轴形成的logistic关系)的关系)

    bubuko.com,布布扣

    下面我们对L(W)求极值。

    bubuko.com,布布扣

    L(W)是negtive 的似然函数。只有是negtive的,才能用梯度下降法求最小值,如果不是negtive的,就要用梯度上升法求最大值了,我们一般不用那个。还要注意我们的代价函数不管是最小二乘法、误差均方、似然函数等,都要求平均,就是前面加上1/m.利用梯度下降法求得的迭代公式是:bubuko.com,布布扣,其中wj代表的是模型参数向量W的第j个元素。

    α代表的是学习速率,yi表示的是第i个样本向量的真实标签(label),也就是第i个样本向量所属的类别(0或1),Y(Xi)表示的是回归模型预测的第i个样本向量为1的概率。xij表示的第i个样本向量Xi的第j个元素。小心不要忘了Σ(i=1:m)(注意因为梯度下降法梯度是目标函数分别对模型参数向量W的第每一个元素求偏导,所以这里W的第每一个元素的值是一个一个求出来的。当然在matlab中,虽然是按向量导入计算的数据,但是本质上还是一个一个计算的w的每个值,而不是直接求的这个向量是多少)

    我们注意到这个迭代公式和线性回归的迭代公式形式是一样的,只是在线性回归中Y(Xi)为Xi的各维度线性叠加即WXi=WXi,而这里Xi的各维度线性叠加WXi以后,还要进行一次非线性映射(即logistic映射),非线性的映射到(0,1)之间Y(Xi)。所以也可以认为logstic回归也是处理的线性问题,即也是求的各维度线性叠加的权重系数,只是求得了各维度线性叠加和以后,不是与Xi所属的类别进行比较,而是非线性映射到所属类别的概率,然后最大似然函数法求模型参数(也就是那个各维度线性叠加的权重,而后面的非线性映射logstic那里没有参数)。

    下面说一个例子:训练样本的特征为80个学生的两门功课的分数,样本值yi为对应的同学是否允许被上大学。训练好以后,用训练好的模型根据某个学生的成绩预测是否被允许上大学?数据中给出被允许上大学为1,不被允许上大学为0。

    程序代码(梯度下降法):

       1: clear all; close all; clc
       2: x = load(‘ex4x.dat‘); %每一行是一个样本
       3: y = load(‘ex4y.dat‘);
       4: [m, n] = size(x);
       5: sample_num = m;
       6: x = [ones(m, 1), x]; %x增加一维。因为前面文字或前几节说了
       7: % Plot the training data
       8: % Use different markers for positives and negatives
       9: figure;
      10: pos = find(y == 1); neg = find(y == 0);%pos 和neg 分别是 y元素=1和0的所在的位置序号组成的向量
      11: plot(x(pos, 2), x(pos,3), ‘+‘)%用+表示那些yi=1所对应的样本
      12: hold on
      13: plot(x(neg, 2), x(neg, 3), ‘o‘)
      14: hold on
      15: xlabel(‘Exam 1 score‘)
      16: ylabel(‘Exam 2 score‘)
      17: itera_num=500;%迭代次数
      18: g = inline(‘1.0 ./ (1.0 + exp(-z))‘); %这个就相当于制造了一个function g(z)=1.0 ./ (1.0 + exp(-z))
      19: plotstyle = {‘b‘, ‘r‘, ‘g‘, ‘k‘, ‘b--‘, ‘r--‘};
      20: figure;%建立新的窗口
      21: alpha = [ 0.0009, 0.001,0.0011,0.0012,0.0013 ,0.0014 ];%下面就分别用这几个学习速率看看哪个更好
      22: for alpha_i = 1:length(alpha) %alpha_i是1,2,...6,表示的是学习速率向量和曲线格式向量的坐标:alpha(alpha_i),plotstyle(alpha_i)
      23:     theta = zeros(n+1, 1);%thera表示样本Xi各个元素叠加的权重系数,这里以向量形式表示,且初始都为0,三维向量
      24:     J = zeros(itera_num, 1);%J是个100*1的向量,第n个元素代表第n次迭代cost function的值(下面用negtive 的对数似然函数,
      25:     %因为是negtive 的,所以是求得极小值)
      26:     for i = 1:itera_num %计算出某个学习速率alpha下迭代itera_num次数后的参数   
      27:         z = x * theta;%这个z是一个列向量,每一个元素是每一个样本Xi的线性叠加和,因为X是所有的样本,因此这里不是一个一个样本算的,
      28:         %而是所有样本一块算的,因此z是一个包含所有样本Xi的线性叠加和的向量。在公式中,是单个样本表示法,而在matlab中都是所有的样本一块来。
      29:         h = g(z);%这个h就是样本Xi所对应的yi=1时,映射的概率。如果一个样本Xi所对应的yi=0时,对应的映射概率写成1-h。
      30:         J(i) =(1/sample_num).*sum(-y.*log(h) - (1-y).*log(1-h));%损失函数的矢量表示法 这里Jtheta是个100*1的列向量。
      31:         grad = (1/sample_num).*x‘*(h-y);%这个是向量形式的,我们看到grad在公式中是gradj=1/m*Σ(Y(Xi)-yi)Xij ,写得比较粗略,
      32:         %这里(Y(Xi)-yi)、Xij %都是标量,而在程序中是以向量的形式运算的,所以不能直接把公式照搬,所以要认真看看,代码中相应改变一下。
      33:         theta = theta - alpha(alpha_i).*grad;
      34:     end

    35:     plot(0:itera_num-1, J(1:itera_num),char(plotstyle(alpha_i)),‘LineWidth‘, 2)

    %此处一定要通过char函数来转换因为包用()索引后得到的还是包cell,

      36:     %所以才要用char函数转换,也可以用{}索引,这样就不用转换了。
      37:     %一个学习速率对应的图像画出来以后再画出下一个学习速率对应的图像。    
      38:     hold on
      39:     if(1 == alpha(alpha_i)) %通过实验发现alpha为0.0013 时效果最好,则此时的迭代后的theta值为所求的值
      40:         theta_best = theta;
      41:     end
      42: end
      43: legend(‘0.0009‘, ‘0.001‘,‘0.0011‘,‘0.0012‘,‘0.0013‘ ,‘0.0014‘);%给每一个线段格式标注上
      44: xlabel(‘Number of iterations‘)
      45: ylabel(‘Cost function‘)

    46: prob = g([1, 20, 80]*theta);

    %把[1, 20, 80]*theta这个带入g(z)得到的就是在exam1=20、exam2=80的条件下,通过的概率(也就是Y=1)的概率是多少。

      47: %画出分界面
      48: % Only need 2 points to define a line, so choose two endpoints
      49: plot_x = [min(x(:,2))-2,  max(x(:,2))+2];%两个点就可以画出来直线,这里这么取x1坐标是让直接的视野更容易包含那些样本点。

    50: plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1));%分界面怎么画呢?问题也就是在x1,x2坐标图中找到

    %那些将x1,x2带入1/(1+exp(-wx))后,使其值>0.5的(x1,x2)

      51: %坐标形成的区域,因为我们知道1/(1+exp(-wx))>0.5

    52: %意味着该区域的(x1,x2)表示的成绩允许上大学的概率>0.5,那么其他的区域就是不被允许上大学,那么1/(1+exp(-wx))=0.5解出来的一个关

    %于x1,x2的方程就是那个分界面。

      53: %我们解出来以后发现,这个方程是一个直线方程:w(2)x1+w(3)x2+w(1)=0

    54: %注意我们不能因为这个分界面是直线,就认为logistic回归是一个线性分类器,注意logistic回归不是一个分类器,他没有分类的功能,

    %这个logistic回归是用来

    55: %预测概率的,这里具有分类功能是因为我们硬性规定了一个分类标准:把>0.5的归为一类,<0.5的归于另一类。这是一个很强的假设,

    %因为本来我们可能预测了一个样本

    56: %所属某个类别的概率是0.6,这是一个不怎么高的概率,但是我们还是把它预测为这个类别,只因为它>0.5.所以最后可能logistic回归加上这

    %个假设以后形成的分类器

      57: %的分界面对样本分类效果不是很好,这不能怪logistic回归,因为logistic回归本质不是用来分类的,而是求的概率。
      58: figure;
      59: plot(x(pos, 2), x(pos,3), ‘+‘)%把分界面呈现在样本点上面,所以还要把样本点画出来。
      60: hold on
      61: plot(x(neg, 2), x(neg, 3), ‘o‘)
      62: hold on
      63: plot(plot_x, plot_y)
      64: legend(‘Admitted‘, ‘Not admitted‘, ‘Decision Boundary‘)
      65: hold off
      66:  

    当学习速率取不同的值时,迭代次数与cost function形成的不同的曲线 如图所示:

    bubuko.com,布布扣

    当学习速率为0.0014时候,我们看到图像开始振荡,说明学习速率过大了。

    当我们将logistic回归应用到分类器中时,如果我们假设p(Y(x)|x)>0.5归为一类,p(Y(x)|x)<0.5归为另一类。那么分类器分界面如图:

    bubuko.com,布布扣

    当我们看到这个图时,我们是不是有种感觉:这个logistic回归比线性回归复杂,为什么结果得到的那么差?

    先说一句,我们不要用这个分界面来评价logistic回归模型的好坏!!! 这个一会再说,我们先说这个分界面公式是怎么产生的。

    分界面怎么画呢?问题也就是在x1,x2坐标图中找到那些将x1,x2带入1/(1+exp(-wx))后,使其值>0.5的(x1,x2)坐标形成的区域,因为我们知道1/(1+exp(-wx))>0.5意味着该区域的(x1,x2)表示的成绩允许上大学的概率>0.5,那么其他的区域就是不被允许上大学,那么1/(1+exp(-wx))=0.5解出来的一个关于x1,x2的方程就是那个分界面。我们解出来以后发现,这个方程是一个直线方程:w(2)x1+w(3)x2+w(1)=0  注意我们不能因为这个分界面是直线,就认为logistic回归是一个线性分类器,注意logistic回归不是一个分类器,他没有分类的功能,这个logistic回归是用来预测概率的,这里具有分类功能是因为我们硬性规定了一个分类标准:把>0.5的归为一类,<0.5的归于另一类。这是一个很强的假设,因为本来我们可能预测了一个样本所属某个类别的概率是0.6,这是一个不怎么高的概率,但是我们还是把它预测为这个类别,只因为它>0.5.所以最后可能logistic回归加上这个假设以后形成的分类器
    的分界面对样本分类效果不是很好,这不能怪logistic回归,因为logistic回归本质不是用来分类的,而是求的概率。

  • 相关阅读:
    linux系统中sed命令替换指定的行
    golang之jwt的token登录 X
    Clickhouse之数据删除方式 X
    Python之解析配置文件 X
    Golang框架之gin X
    [转载]技术管理者应该具备哪些条件 ? X
    python之高级数据结构Collections X
    PHP之常用第三方类库汇总 X
    MySQL管理工具之Beekeeper Studio X
    Clickhouse之常用函数操作 X
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/5095909.html
Copyright © 2020-2023  润新知