逻辑回归_逻辑回归sgd - CSDN
逻辑回归 订阅
logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。 展开全文
logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。
信息
领    域
数据挖掘 疾病诊断 经济预测
定    义
线性回归模型
分    类
计算机 数学
用    途
预测 判别
中文名
logistic回归
外文名
logistic regressive
logistic回归概念
logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。 [1]  logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。 [1]  Logistic回归模型的适用条件1 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。2 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。3 自变量和Logistic概率是线性关系4 各观测对象间相互独立。 [2]  原理:如果直接将线性回归的模型扣到Logistic回归中,会造成方程二边取值区间不同和普遍的非直线关系。因为Logistic中因变量为二分类变量,某个概率作为方程的因变量估计值取值范围为0-1,但是,方程右边取值范围是无穷大或者无穷小。所以,才引入Logistic回归。 [2]  Logistic回归实质:发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。究其原因,是发生和未发生的概率成为了比值 ,这个比值就是一个缓冲,将取值范围扩大,再进行对数变换,整个因变量改变。不仅如此,这种变换往往使得因变量和自变量之间呈线性关系,这是根据大量实践而总结。所以,Logistic回归从根本上解决因变量要不是连续变量怎么办的问题。还有,Logistic应用广泛的原因是许多现实问题跟它的模型吻合。例如一件事情是否发生跟其他数值型自变量的关系。 [2]  注意:如果自变量为字符型,就需要进行重新编码。一般如果自变量有三个水平就非常难对付,所以,如果自变量有更多水平就太复杂。这里只讨论自变量只有三个水平。非常麻烦,需要再设二个新变量。共有三个变量,第一个变量编码1为高水平,其他水平为0。第二个变量编码1为中间水平,0为其他水平。第三个变量,所有水平都为0。实在是麻烦,而且不容易理解。最好不要这样做,也就是,最好自变量都为连续变量。 [2]  spss操作:进入Logistic回归主对话框,通用操作不赘述。发现没有自变量这个说法,只有协变量,其实协变量就是自变量。旁边的块就是可以设置很多模型。“方法”栏:这个根据词语理解不容易明白,需要说明。共有7种方法。但是都是有规律可寻的。“向前”和“向后”:向前是事先用一步一步的方法筛选自变量,也就是先设立门槛。称作“前”。而向后,是先把所有的自变量都进来,然后再筛选自变量。也就是先不设置门槛,等进来了再一个一个淘汰。“LR”和“Wald”,LR指的是极大偏似然估计的似然比统计量概率值,有一点长。但是其中重要的词语就是似然。Wald指Wald统计量概率值。“条件”指条件参数似然比统计量概率值。“进入”就是所有自变量都进来,不进行任何筛选将所有的关键词组合在一起就是7种方法,分别是“进入”“向前LR”“向前Wald”"向后LR"“向后Wald”“向后条件”“向前条件”下一步:一旦选定协变量,也就是自变量,“分类”按钮就会被激活。其中,当选择完分类协变量以后,“更改对比”选项组就会被激活。一共有7种更改对比的方法。“指示符”和“偏差”,都是选择最后一个和第一个个案作为对比标准,也就是这二种方法能够激活“参考类别”栏。“指示符”是默认选项。“偏差”表示分类变量每个水平和总平均值进行对比,总平均值的上下界就是"最后一个"和"第一个"在“参考类别”的设置。“简单”也能激活“参考类别”设置。表示对分类变量各个水平和第一个水平或者最后一个水平的均值进行比较。“差值”对分类变量各个水平都和前面的水平进行作差比较。第一个水平除外,因为不能作差。“Helmert”跟“差值”正好相反。是每一个水平和后面水平进行作差比较。最后一个水平除外。仍然是因为不能做差。“重复”表示对分类变量各个水平进行重复对比。“多项式”对每一个水平按分类变量顺序进行趋势分析,常用的趋势分析方法有线性,二次式。 [2] 
收起全文
精华内容
参与话题
  • 逻辑回归(Logistic Regression)通俗解释

    万次阅读 多人点赞 2018-04-07 00:16:07
    【机器学习】逻辑回归(Logistic Regression)注:最近开始学习《人工智能》选修课,老师提纲挈领的介绍了一番,听完课只了解了个大概,剩下的细节只能自己继续摸索。从本质上讲:机器学习就是一个模型对外界的刺激...


    【机器学习】逻辑回归(Logistic Regression)

    :最近开始学习《人工智能》选修课,老师提纲挈领的介绍了一番,听完课只了解了个大概,剩下的细节只能自己继续摸索。

    从本质上讲:机器学习就是一个模型对外界的刺激(训练样本)做出反应,趋利避害(评价标准)。

     

    1. 什么是逻辑回归?


    许多人对线性回归都比较熟悉,但知道逻辑回归的人可能就要少的多。从大的类别上来说,逻辑回归是一种有监督的统计学习方法,主要用于对样本进行分类。

    在线性回归模型中,输出一般是连续的,例如

    y=f(x)=ax+by=f(x)=ax+b
    ,对于每一个输入的x,都有一个对应的y输出。模型的定义域和值域都可以是[-∞, +∞]。但是对于逻辑回归,输入可以是连续的[-∞, +∞],但输出一般是离散的,即只有有限多个输出值。例如,其值域可以只有两个值{0, 1},这两个值可以表示对样本的某种分类,高/低、患病/健康、阴性/阳性等,这就是最常见的二分类逻辑回归。因此,从整体上来说,通过逻辑回归模型,我们将在整个实数范围上的x映射到了有限个点上,这样就实现了对x的分类。因为每次拿过来一个x,经过逻辑回归分析,就可以将它归入某一类y中。

     

    逻辑回归与线性回归的关系

    逻辑回归也被称为广义线性回归模型,它与线性回归模型的形式基本上相同,都具有 ax+b,其中a和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将ax+b作为因变量,即y = ax+b,而logistic回归则通过函数S将ax+b对应到一个隐状态p,p = S(ax+b),然后根据p与1-p的大小决定因变量的值。这里的函数S就是Sigmoid函数

    S(t)=11+etS(t)=11+e−t

    将t换成ax+b,可以得到逻辑回归模型的参数形式:

    p(x;a,b)=11+e(ax+b)1p(x;a,b)=11+e−(ax+b)……(1)

     

    图1:sigmoid函数的图像

    通过函数S的作用,我们可以将输出的值限制在区间[0, 1]上,p(x)则可以用来表示概率p(y=1|x),即当一个x发生时,y被分到1那一组的概率。可是,等等,我们上面说y只有两种取值,但是这里却出现了一个区间[0, 1],这是什么鬼??其实在真实情况下,我们最终得到的y的值是在[0, 1]这个区间上的一个数,然后我们可以选择一个阈值,通常是0.5,当y>0.5时,就将这个x归到1这一类,如果y<0.5就将x归到0这一类。但是阈值是可以调整的,比如说一个比较保守的人,可能将阈值设为0.9,也就是说有超过90%的把握,才相信这个x属于1这一类。了解一个算法,最好的办法就是自己从头实现一次。下面是逻辑回归的具体实现。

     

    逻辑回归模型的代价函数

    逻辑回归一般使用交叉熵作为代价函数。关于代价函数的具体细节,请参考代价函数,这里只给出交叉熵公式:

    J(θ)=1m[i=1m(y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]J(θ)=−1m[∑i=1m(y(i)log⁡hθ(x(i))+(1−y(i))log⁡(1−hθ(x(i)))]

    m:训练样本的个数;

    hθ(x):用参数θ和x预测出来的y值;

    y:原训练样本中的y值,也就是标准答案

    上角标(i):第i个样本

     

    2. 数据准备


    下面的数据来自《机器学习实战》中的示例:

    复制代码
    -0.017612	14.053064	0
    -1.395634	4.662541	1
    -0.752157	6.538620	0
    -1.322371	7.152853	0
    0.423363	11.054677	0
    0.406704	7.067335	1
    0.667394	12.741452	0
    -2.460150	6.866805	1
    0.569411	9.548755	0
    -0.026632	10.427743	0
    复制代码

     

    上面的数据一共是3列10行,其中前两列为x1和x2的值,第3列表示y的值;10行表示取了10个样本点。我们可以将这些数据当做训练模型参数的训练样本。

    见到训练样本就可以比较直观的理解算法的输入,以及我们如何利用这些数据来训练逻辑回归分类器,进而用训练好的模型来预测新的样本(检测样本)。

    从逻辑回归的参数形式,式子(1)我们可以看到逻辑回归模型中有两个待定参数a(x的系数)和b(常数项),我们现在给出来的数据有两个特征x1, x2,因此整个模型就增加了一项:ax1 + cx2 + b。为了形式上的统一,我们使用带下标的a表示不同的参数(a0表示常数项b并作x0的参数<x0=1>,a1、a2分别表示x1和x2的参数),就可以得到:

    a0x0+a1x1+a2x2a0x0+a1x1+a2x2

    这样统一起来后,就可以使用矩阵表示了(比起前面展开的线性表示方式,用矩阵表示模型和参数更加简便,而且矩阵运算的速度也更快):

    [a0a1a2]x0x1x2=aTX[a0a1a2][x0x1x2]=aTX

     

     将上面的式子带入到(1)式,我们就可以得到逻辑回归的另一种表示形式了:

     

    p(x;a)=11+eaTX2p(x;a)=11+e−aTX……(2)

     此时,可以很清楚的看到,我们后面的行动都是为了确定一个合适的a(一个参数向量),使得对于一个新来的X(也是一个向量),我们可以尽可能准确的给出一个y值,0或者1.

     

    注:数据是二维的,也就是说这组观察样本中有两个自变量,即两个特征(feature)。

     

    3. 训练分类器


    就像上面说的,训练分类器的过程,就是根据已经知道的数据(训练样本)确定一个使得代价函数的值最小的a(参数向量/回归系数)的过程。逻辑回归模型属于有监督的学习方法,上面示例数据中的第3列其实是训练样本提供的"标准答案"。也就是说,这些数据是已经分好类的(两类,0或者1)。在训练阶段,我们要做的就是利用训练样本和(2)式中的模型,估计一个比较合适的参数a,使得仅通过前面两列数据(观察值/测量值)就可以估计一个值h(a),这个值越接近标准答案y,说明我们的模型预测的越准确。

     

    下面是估计回归系数a的值的过程,还是借鉴了《机器学习实战》中的代码,做了少量修改:

    其中计算参数梯度,即代价函数对每个参数的偏导数(下面代码中的第36-38行),的详细推导过程可以参考这里

    复制代码
     1 '''
     2 Created on Oct 27, 2010
     3 Logistic Regression Working Module
     4 @author: Peter
     5 '''
     6 from numpy import *
     7 import os
     8 
     9 path = 'D:\MechineLearning\MLiA_SourceCode\machinelearninginaction\Ch05'
    10 training_sample = 'trainingSample.txt'
    11 testing_sample = 'testingSample.txt'
    12 
    13 # 从文件中读入训练样本的数据,同上面给出的示例数据
    14 # 下面第20行代码中的1.0表示x0 = 1
    15 def loadDataSet(p, file_n):
    16     dataMat = []; labelMat = []
    17     fr = open(os.path.join(p, file_n))
    18     for line in fr.readlines():
    19         lineArr = line.strip().split()
    20         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])  # 三个特征x0, x1, x2
    21         labelMat.append(int(lineArr[2]))  # 标准答案y
    22     return dataMat,labelMat
    23 
    24 def sigmoid(inX):
    25     return 1.0/(1+exp(-inX))
    26 
    27 # 梯度下降法求回归系数a,由于样本量少,我将迭代次数改成了1000次
    28 def gradAscent(dataMatIn, classLabels):
    29     dataMatrix = mat(dataMatIn)             #convert to NumPy matrix
    30     labelMat = mat(classLabels).transpose() #convert to NumPy matrix
    31     m,n = shape(dataMatrix)
    32     alpha = 0.001  # 学习率
    33     maxCycles = 1000
    34     weights = ones((n,1))
    35     for k in range(maxCycles):              # heavy on matrix operations
    36         h = sigmoid(dataMatrix*weights)     # 模型预测值, 90 x 1
    37         error = h - labelMat                # 真实值与预测值之间的误差, 90 x 1
    38         temp = dataMatrix.transpose()* error # 交叉熵代价函数对所有参数的偏导数, 3 x 1
    39         weights = weights - alpha * temp  # 更新权重
    40     return weights
    41 
    42 # 下面是我自己写的测试函数
    43 def test_logistic_regression():
    44     dataArr, labelMat = loadDataSet(path, training_sample)  # 读入训练样本中的原始数据
    45     A = gradAscent(dataArr, labelMat)  # 回归系数a的值
    46     h = sigmoid(mat(dataArr)*A)  #预测结果h(a)的值
    47     print(dataArr, labelMat)
    48     print(A)
    49     print(h)
    50     # plotBestFit(A.getA())
    51 
    52 test_logistic_regression()
    复制代码

     

    上面代码的输出如下:

    • 一个元组,包含两个数组:第一个数组是所有的训练样本中的观察值,也就是X,包括x0, x1, x2;第二个数组是每组观察值对应的标准答案y。
    ([[1.0, -0.017612, 14.053064], [1.0, -1.395634, 4.662541], [1.0, -0.752157, 6.53862], [1.0, -1.322371, 7.152853], [1.0, 0.423363, 11.054677], [1.0, 0.406704, 7.067335], [1.0, 0.667394, 12.741452], [1.0, -2.46015, 6.866805], [1.0, 0.569411, 9.548755], [1.0, -0.026632, 10.427743]], [0, 1, 0, 0, 0, 1, 0, 1, 0, 0])  

     

    • 本次预测出来的回归系数a,包括a0, a1, a2
    [[ 1.39174871]
    [-0.5227482 ]
    [-0.33100373]]  

     

    • 根据回归系数a和(2)式中的模型预测出来的h(a)。这里预测得到的结果都是区间(0, 1)上的实数。
    复制代码
    [[ 0.03730313]
    [ 0.64060602]
    [ 0.40627881]
    [ 0.4293251 ]
    [ 0.07665396]
    [ 0.23863652]
    [ 0.0401329 ]
    [ 0.59985228]
    [ 0.11238742]
    [ 0.11446212]]  
    复制代码

    标准答案是{0, 1},如何将预测到的结果与标准答案y进行比较呢?取0.5作为阈值,大于该值的样本就划分到1这一组,小于等于该值的样本就划分到0这一组,这样就可以将数据分为两类。检查一下结果可以看到,我们现在分出来的1这一类中包括原来y=1的两个样本,另一类包括原来y=0的所有样本和一个y=1的样本(分错了)。鉴于我们选择取的样本比较少(只有10个),这样的效果其实还算非常不错的!

     

     4. 结果展示


    上面已经求出了一组回归系数,它确定了不同类别数据之间的分割线。可以利用X内部(x1与x2之间的关系)的关系画出该分割线,从而更直观的感受到分类的效果。

     

    添加下面一段代码:

    复制代码
     1 # 分类效果展示,参数weights就是回归系数
     2 def plotBestFit(weights):
     3     import matplotlib.pyplot as plt
     4     dataMat,labelMat=loadDataSet()
     5     dataArr = array(dataMat)
     6     n = shape(dataArr)[0]
     7     xcord1 = []; ycord1 = []
     8     xcord2 = []; ycord2 = []
     9     for i in range(n):
    10         if int(labelMat[i])== 1:
    11             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
    12         else:
    13             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
    14     fig = plt.figure()
    15     ax = fig.add_subplot(111)
    16     ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    17     ax.scatter(xcord2, ycord2, s=30, c='green')
    18     x = arange(-3.0, 3.0, 0.1)
    19     y = (-weights[0]-weights[1]*x)/weights[2]  # x2 = f(x1)
    20     ax.plot(x, y)
    21     plt.xlabel('X1'); plt.ylabel('X2');
    22     plt.show()
    复制代码

    将上面的test_logistic_regression()函数中的最后一句注释去掉,调用plotBestFit函数就可以看到分类的效果了。

    这里说明一下上面代码中的第19行,这里设置了sigmoid函数的取值为1/2,也就是说取阈值为0.5来划分最后预测的结果。这样可以得到

    eaTX=1e−aTX=1
    ,即-aTX=0,可以推出x2 = (-a0x0 - a1x1)/a2,同第19行,也就是说这里的y实际上是x2,而x是x1。因此下图表示的是x1与x2之间的关系。

    分类效果图如下:

    三个红色的点是原来y=1的样本,有一个分错了。这里相当于将所有的数据用二维坐标(x1, x2)表示了出来,而且根据回归参数画出的线将这些点一分为二。如果有新的样本,不知道在哪一类,只用将该点画在图上,看它在这条直线的哪一边就可以分类了。

     

    下面是使用90个训练样本得到的结果:

    可以看出一个非常明显的规律是,y=1的这一类样本(红色的点)具有更小的x2值,当x2相近时则具有更大的x1值。

    此时计算出来的回归系数a为:

    [[ 5.262118 ]
    [ 0.60847797]
    [-0.75168429]]

     

    5. 预测新样本


    添加一个预测函数,如下:

    直接将上面计算出来的回归系数a拿来使用,测试数据其实也是《机器学习实战》这本书中的训练数据,我拆成了两份,前面90行用来做训练数据,后面10行用来当测试数据。

    1 def predict_test_sample():
    2     A = [5.262118, 0.60847797, -0.75168429]  # 上面计算出来的回归系数a
    3     dataArr, labelMat = loadDataSet(path, testing_sample)  
    4     h_test = sigmoid(mat(dataArr) * mat(A).transpose())  # 将读入的数据和A转化成numpy中的矩阵
    5     print(h_test)  # 预测的结果

     

    调用上面的函数,可以得到以下结果,即h(a):

    复制代码
    [[ 0.99714035]
    [ 0.04035907]
    [ 0.12535895]
    [ 0.99048731]
    [ 0.98075409]
    [ 0.97708653]
    [ 0.09004989]
    [ 0.97884487]
    [ 0.28594188]
    [ 0.00359693]]
    复制代码

     

    下面是我们的测试数据(原来的训练样本后十行的数据,包括标准答案y):

    复制代码
    0.089392	-0.715300	1
    1.825662	12.693808	0
    0.197445	9.744638	0
    0.126117	0.922311	1
    -0.679797	1.220530	1
    0.677983	2.556666	1
    0.761349	10.693862	0
    -2.168791	0.143632	1
    1.388610	9.341997	0
    0.317029	14.739025	0
    复制代码

     

    比较我们预测得到的h(a)和标准答案y,如果按照0.5为分界线的话,我们利用前90个样本训练出来的分类器对后面10个样本的类型预测全部正确。

     

     

    附件:

    完整代码:https://github.com/OnlyBelter/MachineLearning_examples/tree/master/de_novo/regression

    训练数据:https://github.com/OnlyBelter/MachineLearning_examples/blob/master/de_novo/data/Logistic_Regression-trainingSample.txt

    测试数据:https://github.com/OnlyBelter/MachineLearning_examples/blob/master/de_novo/data/Logistic_Regression-testingSample.txt

     

    参考:

    http://baike.baidu.com/item/logistic%E5%9B%9E%E5%BD%92

    https://en.wikipedia.org/wiki/Sigmoid_function

    《机器学习实战》,哈林顿著,李锐等译,人民邮电出版社,2013年6月第一版


    展开全文
  • 逻辑回归原理详细推导

    万次阅读 多人点赞 2018-10-02 12:08:36
    1. 基本原理 Logistic Regression和Linear Regression的原理是相似的,可以简单描述为以下过程: (1)找一个合适的预测函数(Andrew Ng的公开课中称为hypothesis),一般表示为h函数,该函数就是我们需要找的分类...

    1. 基本原理

    Logistic Regression和Linear Regression的原理是相似的,可以简单描述为以下过程:

    (1)找一个合适的预测函数(Andrew Ng的公开课中称为hypothesis),一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

    (2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

    (3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有的是梯度下降法(Gradient Descent)。

     

    2. 具体过程

    2.1  构造预测函数

    Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于两分类问题(即输出只有两种)。根据第二章中的步骤,需要先找到一个预测函数(h),显然,该函数的输出必须是两个值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:

              

    对应的函数图像是一个取值在0和1之间的S型曲线(图1)。

     

    图1

    接下来需要确定数据划分的边界类型,对于图2和图3中的两种数据分布,显然图2需要一个线性的边界,而图3需要一个非线性的边界。接下来我们只讨论线性边界的情况。

     

    图2

     

    图3

    对于线性边界的情况,边界形式如下:

    构造预测函数为:

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

     

    2.2  构造Cost函数

    Andrew Ng在课程中直接给出了Cost函数及J(θ)函数如式(5)和(6),但是并没有给出具体的解释,只是说明了这个函数来衡量h函数预测的好坏是合理的。

    其实这里可以通过数学上的最大似然估计来理解。^{h_{\Theta }}(x)作为概率密度函数,进行连乘,然后取对数。

    实际上这里的Cost函数和J(θ)函数是基于最大似然估计推导得到的。下面详细说明推导的过程。(4)式综合起来可以写成:

    取似然函数为:

    对数似然函数为:

    最大似然估计就是要求得使l(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求的最佳参数。但是,在Andrew Ng的课程中将J(θ)取为(6)式,即:

    因为乘了一个负的系数-1/m,所以J(θ)取最小值时的θ为要求的最佳参数。

     

    2.3  梯度下降法求J(θ)的最小值

    J(θ)的最小值可以使用梯度下降法,根据梯度下降法可得θ的更新过程:

        

    式中为α学习步长,下面来求偏导:

    上式求解过程中用到如下的公式:

    因此,(11)式的更新过程可以写成:

     

    因为式中α本来为一常量,所以1/m一般将省略,所以最终的θ更新过程为:

    另外,补充一下,3.2节中提到求得l(θ)取最大值时的θ也是一样的,用梯度上升法求(9)式的最大值,可得:

      

    观察上式发现跟(14)是一样的,所以,采用梯度上升发和梯度下降法是完全一样的,这也是《机器学习实战》中采用梯度上升法的原因。

     

    2.4  梯度下降过程向量化

    关于θ更新过程的vectorization,Andrew Ng的课程中只是一带而过,没有具体的讲解。

    《机器学习实战》连Cost函数及求梯度等都没有说明,所以更不可能说明vectorization了。但是,其中给出的实现代码确是实现了vectorization的,图4所示代码的32行中weights(也就是θ)的更新只用了一行代码,直接通过矩阵或者向量计算更新,没有用for循环,说明确实实现了vectorization,具体代码下一章分析。

    文献[3]中也提到了vectorization,但是也是比较粗略,很简单的给出vectorization的结果为:

        

    且不论该更新公式正确与否,这里的Σ(...)是一个求和的过程,显然需要一个for语句循环m次,所以根本没有完全的实现vectorization,不像《机器学习实战》的代码中一条语句就可以完成θ的更新。

    下面说明一下我理解《机器学习实战》中代码实现的vectorization过程。

    约定训练数据的矩阵形式如下,x的每一行为一条训练样本,而每一列为不同的特称取值:

    约定待求的参数θ的矩阵形式为:

              

    先求x.θ并记为A

    hθ(x)-y并记为E

    g(A)的参数A为一列向量,所以实现g函数时要支持列向量作为参数,并返回列向量。由上式可知hθ(x)-y可以由g(A)-y一次计算求得。

    再来看一下(15)式的θ更新过程,当j=0时:

    同样的可以写出θj

    综合起来就是:

    综上所述,vectorization后θ更新的步骤如下:

    (1)求A=x.θ

    (2)求E=g(A)-y

    (3)求θ:=θ-α.x'.E,x'表示矩阵x的转置。

    也可以综合起来写成:

    前面已经提到过:1/m是可以省略的。

    3. 代码分析

    图4中是《机器学习实战》中给出的部分实现代码。

     

    图4

    sigmoid函数就是前文中的g(z)函数,参数inX可以是向量,因为程序中使用了Python的numpy。

    gradAscent函数是梯度上升的实现函数,参数dataMatin和classLabels为训练数据,23和24行对训练数据做了处理,转换成numpy的矩阵类型,同时将横向量的classlabels转换成列向量labelMat,此时的dataMatrix和labelMat就是(18)式中的xy。alpha为学习步长,maxCycles为迭代次数。weights为n维(等于x的列数)列向量,就是(19)式中的θ

    29行的for循环将更新θ的过程迭代maxCycles次,每循环一次更新一次。对比3.4节最后总结的向量化的θ更新步骤,30行相当于求了A=x.θg(A),31行相当于求了E=g(A)-y,32行相当于求θ:=θ-α.x'.E。所以这三行代码实际上与向量化的θ更新步骤是完全一致的。

    本文来自:https://blog.csdn.net/nowfuture/article/details/81840871?utm_source=copy

    展开全文
  • 彻底搞懂逻辑回归

    千次阅读 2019-06-12 11:04:26
    在线性感知器算法中,我们使用了一个f(x)=x函数,作为激励函数,而在逻辑斯蒂回归中,我们将会采用sigmoid函数作为激励函数,所以它被称为sigmoid回归也叫对数几率回归(logistic regression),需要注意的是,虽然...

    在线性感知器算法中,我们使用了一个f(x)=x函数,作为激励函数,而在逻辑斯蒂回归中,我们将会采用sigmoid函数作为激励函数,所以它被称为sigmoid回归也叫对数几率回归(logistic regression),需要注意的是,虽然它的名字中带有回归,但事实上它并不是一种回归算法,而是一种分类算法。它的优点是,它是直接对分类的可能性进行建模的,无需事先假设数据分布,这样就避免了假设分布不准确所带来的问题,因为它是针对于分类的可能性进行建模的,所以它不仅能预测出类别,还可以得到属于该类别的概率。除此之外,sigmoid函数它是任意阶可导的凸函数。在这篇文章中,将会使用到梯度上升算法,可能有很多同学学到这里会有点迷糊,之前我们所使用的是,梯度下降算法为什么到这里却使用的是梯度上升算法?

    一、逻辑斯蒂回归
    逻辑斯蒂回归是针对线性可分问题的一种易于实现而且性能优异的分类模型,是使用最为广泛的分类模型之一。假设某件事发生的概率为p,那么这件事不发生的概率为(1-p),我们称p/(1-p)为这件事情发生的几率。取这件事情发生几率的对数,定义为logit(p),所以logit(p)为

    因为logit函数的输入取值范围为[0,1](因为p为某件事情发生的概率),所以通过logit函数可以将输入区间为[0,1]转换到整个实数范围内的输出,log函数图像如下

    将对数几率记为输入特征值的线性表达式如下:

    其中,p(y=1|x)为,当输入为x时,它被分为1类的概率为p,也属于1类别的条件概率。而,实际上我们需要的是给定一个样本的特征输入x,而输出是一个该样本属于某类别的概率。所以,我们取logit函数的反函数,也被称为logistic函数,也就是sigmoid函数

    ϕ(z)中的z为样本特征与权重的线性组合。通过函数图像可以发现sigmoid函数的几个特点,当z趋于正无穷大的时候,ϕ(z)趋近于1,因为当z趋于无穷大的时候,e^(-z)趋于零,所以分母会趋于1,当z趋于负无穷大的时候,e^(-z)会趋于正无穷大,所以ϕ(z)会趋于0。如在预测天气的时候,我们需要预测出明天属于晴天和雨天的概率,已知根天气相关的特征和权重,定义y=1为晴天,y=-1为雨天,根据天气的相关特征和权重可以获得z,然后再通过sigmoid函数可以获取到明天属于晴天的概率ϕ(z)=P(y=1|x),如果属于晴天的概率为80%,属于雨天的概率为20%,那么当ϕ(z)>=0.8时,就属于雨天,小于0.8时就属于晴天。我们可以通过以往天气的特征所对应的天气,来求出权重和ϕ(z)的阈值,也就是天气所说的0.8。逻辑斯蒂回归除了应用于天气预测之外,还可以应用于某些疾病预测,所以逻辑斯蒂回归在医疗领域也有广泛的应用。

     

    二、求逻辑斯蒂回归的权重
    在线性感知器中,我们通过梯度下降算法来使得预测值与实际值的误差的平方和最小,来求得权重和阈值。前面我们提到过某件事情发生的几率为p/(1-p),而在逻辑斯蒂回归中所定义的代价函数就是使得该件事情发生的几率最大,也就是某个样本属于其真实标记样本的概率越大越好。如,一个样本的特征x所对应的标记为1,通过逻辑斯蒂回归模型之后,会给出该样本的标记为1和为-1的概率分别是多少,我们当然希望模型给出该样本属于1的概率越大越好,正因为我们的代价函数需要求的是最大值,所以后面会使用到梯度上升算法而不是梯度下降算法。为了求得记录的最大值,我们需要使用最大似然函数L,假定数据集中的每个样本都是相互独立的,L(w)的计算公式如下

    通过上面的公式可以发现,当似然函数的值非常小的晚上好,可以会出现数值溢出的情况为了降低这种情况发生的可能性和方便对似然函数进行最大化处理,取似然函数的对数

    通过梯度上升算法求最大化似然函数的对数或者在将似然函数的对数乘以-1使用梯度下降算法进行最小化,通过上面的公式可以发现,当y=0的时候,第一项为0,当y=1的时候第二项为0,损失函数如下

     

    通过上图,可以观察到,当样本被正确的划分的时候损失函数是接近与0的,当样本被错误的划分的时候损失函数是趋于无穷大,这就意味着错误的预测所带来的代价将会越来越大,相对于之前的线性感知器而言,logistic回归错误预测所带来的代价要大的多。

    三、logistic回归权重更新
    相对于之前的线性感知器而言,我们只需要修改激活函数和代价函数。在实现logistic回归之前,需要先计算出对数似然函数对于w的偏导,得到每次权重更新的Δω。

    所以Δω应该为

    如果使用梯度下降算法,则ω=ω-Δω,如果使用梯度上升算法ω=ω+Δω。

     

    展开全文
  • 逻辑回归模型(logistic regression)

    万次阅读 2017-01-20 09:35:13
    逻辑回归

    逻辑回归模型意义

    逻辑回归是机器学习中做分类任务常用的方法,属于“广义的线性模型”,即:

    考虑二分类任务,其输出标记y∈{0,1},而线性回归模型产生的预测值 z = wx+b是实值,于是,需要将实值z转换为0/1值。最理想的是“单位阶跃函数”:

    即若预测值z大于0就判断为正例,小于零则判断为反例,预测值为临界值零则可任意判断。但是阶跃函数不是连续的,不能直接作用于g-(),因此考虑用另一函数代替阶跃函数,即sigmoid函数:

    对应的图像:

    可以看到sigmoid有如下特性(y = g(z),z=wx + b),当z>>0时,y->1,当z<<0时,y->0。这其实有着很强的实际意义(y就代表了该样本属于正例的概率),通过下张图更好理解:

    这是一个有着二维属性的样本分类任务(图中h即上文y,w对应θ1、θ2,b用θ0替代),通过训练样本模型找到最好的[θ0,θ1,θ2](对应代价函数的极值点),而(θ0+θ1x1+θx2 =0)就对应着图中的决策决策边界(decision boundry)

    对于测试样本(x1,x2)来说,如果:

    θ0+θ1x1+θ2x2(即z)>>0,说明其处于边界线上方,距离边界很远,是一个正例概率很大,因此y = sigmoid(z)->1

    θ0+θ1x1+θ2x2(即z)<<0,说明其处于边界线下方,距离边界很远,它基本不可能是正例子,因此y = sigmoid(z)->0

    θ0+θ1x1+θ2x2(即z)->0,说明其处于边界线附近,是不是正例模棱两可,因此y = sigmoid(z)->0.5(概率0.5)


    逻辑回归模型求解参数(寻找θ)

    逻辑回归的求解参数方式和一般优化问题没有什么不同,最基本的方式就是梯度下降法,只要写出其代价函数以及参数θ的梯度公式即可(推导过程可参见其它教材):

    值得注意的是逻辑回归的梯度更新公式与线性回归很像,但其实是有差别的,即hθ(x)的形式不同(逻辑回归为sigmoid函数):


    展开全文
  • 逻辑回归 - 理论篇

    万次阅读 多人点赞 2018-07-28 12:17:41
    什么是逻辑回归? Logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于它们的因变量不同,其他的基本都差不多。正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedli...
  • LR回归,虽然这个算法从名字上来看,是回归算法,但其实际上是一个分类算法,学术界也叫它logit regression, maximum-entropy classification (MaxEnt)或者是the log-linear classifier。在机器学习算法中,有几十种...
  • 逻辑回归(logistics regression)

    万次阅读 多人点赞 2018-12-02 16:20:15
    逻辑回归(logistics regression)  前几章分别讲了多元线性回归的推理思路和求解过程(解析解求解和梯度下降求解),文章并不以代码和公式推导过程为重点,目的是跟大家一起理解算法.前两章的内容是学习算法的基础,所以...
  • 线性回归和逻辑回归的区别

    万次阅读 2018-10-30 10:36:02
    回归问题的条件/前提: 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1. 线性回归 假设 特征 和 结果 都满足线性。...
  • 逻辑回归(Logistic Regression, LR)简介

    万次阅读 多人点赞 2019-11-25 14:27:27
    逻辑回归(Logistic Regression, LR)简介 标签(空格分隔): 机器学习 机器学习最通俗的解释就是让机器学会决策。对于我们人来说,比如去菜市场里挑选芒果,从一堆芒果中拿出一个,根据果皮颜色、大小、软硬等...
  • 逻辑回归(logistic regression)原理详解

    万次阅读 多人点赞 2018-08-09 08:56:39
    机器学习解决的问题,大体上就是两种:数值预测和分类。前者一般采用的是回归模型,比如最常用的线性回归;后者的方法则五花八门,决策树,kNN,支持向量机,朴素贝叶斯...这里面有一类比较特殊的算法,就是逻辑回归...
  • 逻辑回归(Logistic Regression)

    万次阅读 多人点赞 2017-12-01 13:27:36
    一、什么是逻辑回归  机器学习算法三要素:模型、参数、目标函数。     1.模型   设X是连续随机变量,x服从logistic分布是指其具有下列分布函数和密度函数: F(x)=P(x≤x)=11+e−(x−u)/γ f(x)=F′(x)=e...
  • sklearn中逻辑回归参数调整

    万次阅读 2018-06-04 13:42:47
    sklearn中逻辑回归的参数http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html参数解释:http://blog.csdn.net/sun_shengyun/article/details/53811483逻辑回归的参数...
  • 逻辑回归中的损失函数的解释

    万次阅读 2019-08-30 11:16:02
    1.Logistic Regression(逻辑回归逻辑回归是机器学习中的一个非常常见的模型, 逻辑回归模型其实仅在线性回归的基础上,套用了一个逻辑函数。 逻辑回归可以看做是两步,第一步和线性回归模型的形式相同,即一个...
  • 逻辑回归和线性回归区别

    万次阅读 2017-08-22 11:55:15
    1)线性回归要求变量服从正态分布,logistic回归对变量分布没有要求。 2)线性回归要求因变量是连续性数值变量,而logistic回归要求因变量是分类型变量。 3)线性回归要求自变量和因变量呈线性关系,而logistic...
  • 逻辑回归与线性回归的区别与联系

    万次阅读 2018-07-28 17:22:20
    逻辑回归与线性回归都属于广义线性回归模型,其区别与联系从以下几个方面比较: 分类与回归:回归模型就是预测一个连续变量(如降水量,价格等)。在分类问题中,预测属于某类的概率,可以看成回归问题。这可以说是...
  • 转载:https://www.zhihu.com/question/29385169/answer/44177582 辛俊波 ...逻辑回归的模型引入了sigmoid函数映射,是非线性模型,但本质上又是一个线性回归模型,因为除去sigmoid
  • 逻辑回归优缺点

    万次阅读 2017-01-07 17:11:35
    优点: 1)预测结果是界于0和1之间的概率; ...2)可以适用于连续性和类别...1)对模型中自变量多重共线性较为敏感,例如两个高度相关自变量同时放入模型,可能导致较弱的一个自变量回归符号不符合预期,符号被扭
  • 逻辑回归的参数详解及属性

    万次阅读 2018-08-27 20:22:34
    逻辑回归类中实现了二分类、一对多分类,多项式逻辑回归。 针对优化算法的解释如下: “lbfgs”, “sag” 和 “newton-cg” solvers (求解器)只支持 L2 惩罚项,对某些高维数据收敛更快。这些求解器的参数 `...
  • 解释logistic回归为什么要使用sigmoid函数

    万次阅读 多人点赞 2018-03-14 11:05:17
    &nbsp;&nbsp;这篇博客是在知乎上有个乎友问的问题,我的回答
  • 线性回归和逻辑回归的比较

    万次阅读 多人点赞 2018-09-12 20:48:31
    线性回归 用一组变量的(特征)的线性组合,来建立与...逻辑回归用于分类,而不是回归。 在线性回归模型中,输出一般是连续的, 对于每一个输入的x,都有一个对应的输出y。因此模型的定义域和值域都可以是无穷...
1 2 3 4 5 ... 20
收藏数 107,605
精华内容 43,042
关键字:

逻辑回归