从广义线性回归模型介绍模型解释为什么逻辑回归使用sigmoid函数

【图文】第3章-广义线性模型_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第3章-广义线性模型
上传于||暂无简介
大小:656.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢逻辑回归算法分析及在MLlib中的实现剖析
逻辑回归作为分类算法的一种,在互联网领域中的预测、判别中应用的非常广泛,像广告投放中的点击率预估,推荐算法中的模型融合等等。本文简要介绍逻辑回归的算法,以及在MLlib中的实现解析。逻辑回归其实是一个分类问题,此类问题的模型训练,基本上分3步骤,第一步要寻找假设预测函数h,构造的假设函数为在线性回归的函数基础上,加上一个Sigmoid函数进行Norm,把函数值输出在0到1的范围内,函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:第二步要构造损失函数J,基于最大似然估计推导出,&&&&   其中:第三步求得使最小值时的参数,解决这个问题的做法是随机给定一个初始值,通过迭代,在每次迭代中计算损失函数的下降方向并更新,直到目标函数收敛稳定在最小点。迭代优化算法就是损失函数的下降方向的计算,有梯度下降、牛顿迭代算法、拟牛顿迭代算法(BFGS算法和L-BFGS算法)下面对这些优化算法做简单介绍。(1)梯度下降对损失函数求偏导,更新过程可以写成:基于导数,基于梯度的方法优化方法有一个问题,在两次函数中,函数等高线是一个非常扁的椭圆,收敛速度是很慢的,比如在模型训练中有大量的特征,他们的物理意义有时候是不明确的,无法对他们进行归一化处理操作。梯度下降每次更新都需要遍历所有data,当数据量太大或者一次无法获取全部数据时,这种方法并不可行。针对梯度下降每一步都是收敛速度慢的问题,引进随机梯度下降,在每一次计算之后便更新参数,而不需要首先将所有的训练集求和,在梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。但是这样的算法存 在的问题是,不是每一步都是朝着“正确”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。&(2) 牛顿法(Newton Methods)牛顿法是在当前参数下,利用二次泰勒展开近似目标函数,然后利用该近似函数来求解目标函数的下降方向。该算法需要计算海森矩阵,因此算法需要花费大量的时间,迭代时间较长。牛顿法要求Hession矩阵是正定的,但在实际问题中,很难保证是正定的。(3) 拟牛顿法(Quasi-Newton Methods):使用近似算法,计算海森矩阵,从而降低算法每次迭代的时间,提高算法运行的效率。在拟牛顿算法中较为经典的算法有两种:BFGS算法和L-BFGS算法。BFGS算法是利用原有的所有历史计算结果,近似计算海森矩阵,虽然提高了整个算法的效率,但是由于需要保存大量历史结果,因此该算法受到内存的大小的局限,限制了算法的应用范围;而L-BFGS则是正是针对BFGS消耗内存较大的特点,为了解决空间复杂度的问题,只保存有限的计算结果,大大降低了算法对于内存的依赖。L-BFGS在特征量大时比BFGS实用,可以非常容易用map/reduce实现分布式求解,mapper求部分数据上的梯度,reducer求和并更新参数。它与梯度法实现复杂一点的地方在,它需要保存前几次的模型,才能计算当前迭代的更新值。&在实际应该过程中,为了增强模型的泛化能力,防止我们训练的模型过拟合,特别是对于大量的稀疏特征,模型复杂度比较高,需要进行降维,我们需要保证在训练误差最小化的基础上,通过加上正则化项减小模型复杂度。在逻辑回归中,有L1、L2进行正则化。损失函数如下:在损失函数里加入一个正则化项,正则化项就是权重的L1或者L2范数乘以一个,用来控制损失函数和正则化项的比重,直观的理解,首先防止过拟合的目的就是防止最后训练出来的模型过分的依赖某一个特征,当最小化损失函数的时候,某一维度很大,拟合出来的函数值与真实的值之间的差距很小,通过正则化可以使整体的cost变大,从而避免了过分依赖某一维度的结果。当然加正则化的前提是特征值要进行归一化。L2正则化假设模型参数服从高斯分布,L2正则化函数比L1更光滑,所以更容易计算;L1假设模型参数服从拉普拉斯分布,L1正则化具备产生稀疏解的功能,从而具备feature selection的能力L1的计算公式使用了L1&regularization(R(w) = ||w||),利用soft-thresholding方法求解,参数weight更新规则为:signum是符号函数,它的取值如下:使用了L2&regularization(R(w) = 1/2 ||w||^2),参数weights更新规则为:&基于逻辑回归的方法有独特的优势,比较简单,计算的代价不高,可以在线的进行训练;缺点是分类的精度可能不高,只支持线性,对非线性的数据支持能力比较弱,需要进行特征处理,包括特征的预处理、正则化L1\L2等等。在MLlib中,逻辑回归的训练模型是LogisticRegressionModel,包括:override val weights: Vector//每个特征的权重
override val intercept: Double,//a
val numFeatures: Int,
val numClasses: Int)根据训练的模型利用如下公式来对新的向量计算进行预测分类def predict(testData: Vector): Double = {
predictPoint(testData, weights, intercept)
override protected def predictPoint(
dataMatrix: Vector, //待预测数据
weightMatrix: Vector, //模型中的weight权重向量
intercept: Double)//代表上面公式中的a
所以逻辑回归的重点是利用标记的数据集合,结合算法把模型训练出来。我们先分析一下MLlib回归分类的类图和训练的关键方法&如上图所见,MLlib中逻辑回归有两种,一个是梯度下降LogisticRegressionWithSGD,一个是L-BFGSLogisticRegressionWithLBFGS,基类是GeneralizedLinearAlgorithm,进行模型的训练,在训练过程中调用相关优化器进行optimize工作,在对应的优化器Optimizer中会调用正则化Updater进行模型的正则化。训练的核心方法是GeneralizedLinearAlgorithm.run,我们来看一下,基本步骤是:1、& 对特征进行相关的预处理StandardScaler能够把feature按照列转换成mean=0,standarddeviation=1的正态分布。2、& 优化,这是核心,利用最优化算法进行迭代训练,得出最优解 optimizer.optimize3、& 创建模型 createModel(weights,intercept)看一下梯度下降SGD在MLlib中的实现LogisticRegressionWithSGD
def train(
input: RDD[LabeledPoint],//输入数据,每一个向量是LabelPoint,包括label、features数组
numIterations: Int,//迭代次数
stepSize: Double,//迭代步长
miniBatchFraction: Double,// 每次迭代参与计算的样本比例,默认1.0
initialWeights: Vector//weight向量初值
regParam:regularization//正则化控制参数
): LogisticRegressionModel = {
new LogisticRegressionWithSGD(stepSize, numIterations, 0.0, miniBatchFraction)
.run(input, initialWeights)//调用基类GeneralizedLinearAlgorithm进行模型训练
看一下梯度下降优化器的在MLlib中算法实现,可以参见代码中的注解GradientDescent
def runMiniBatchSGD(
data: RDD[(Double, Vector)],
gradient: Gradient,
updater: Updater,
stepSize: Double,
numIterations: Int,
regParam: Double,
miniBatchFraction: Double,
initialWeights: Vector): (Vector, Array[Double]) = {
//迭代过程中的损失历史
val stochasticLossHistory = new ArrayBuffer[Double](numIterations)
val numExamples = data.count()
// if no data, return initial weights to avoid NaNs
if (numExamples == 0) {
logWarning(&GradientDescent.runMiniBatchSGD returning initial weights, no data found&)
return (initialWeights, stochasticLossHistory.toArray)
if (numExamples * miniBatchFraction & 1) {
logWarning(&The miniBatchFraction is too small&)
// Initialize weights as a column vector
var weights = Vectors.dense(initialWeights.toArray)
val n = weights.size
* For the first iteration, the regVal will be initialized as sum of weight squares
* if it's L2 for L1 updater, the same logic is followed.
var regVal = pute(
weights, Vectors.dense(new Array[Double](weights.size)), 0, 1, regParam)._2
for (i &- 1 to numIterations) {
//weights向量在下一次迭代计算的过程中,参与计算的Executor都需要,使用了broadcast变量广播到到每个节点,提高了计算效率
val bcWeights = data.context.broadcast(weights)
// Sample a subset (fraction miniBatchFraction) of the total data
// compute and sum up the subgradients on this subset (this is one map-reduce)
// RDD.treeAggregate会把Job提交任务到Executor中执行,参数seqOp被并行执行,comOp在Job中task成功执行返回后调用
sample是根据miniBatchFraction指定的比例随机采样相应数量的样本
val (gradientSum, lossSum, miniBatchSize) = data.sample(false, miniBatchFraction, 42 + i)
.treeAggregate((BDV.zeros[Double](n), 0.0, 0L))(
seqOp = (c, v) =& {
// c: (grad, loss, count), v: (label, features)
      // grad就是对J(Θ)求导的计算结果,loss为J(Θ)的计算结果
调用pute逐个计算gradient和loss并累加在一起,得到这一轮迭代总的gradient和loss的变化。
val l = pute(v._2, v._1, bcWeights.value, Vectors.fromBreeze(c._1))
(c._1, c._2 + l, c._3 + 1)
combOp = (c1, c2) =& {
// c: (grad, loss, count)
(c1._1 += c2._1, c1._2 + c2._2, c1._3 + c2._3)
if (miniBatchSize & 0) {
* NOTE(Xinghao): lossSum is computed using the weights from the previous iteration
* and regVal is the regularization value computed in the previous iteration as well.
stochasticLossHistory.append(lossSum / miniBatchSize + regVal)
//pute更新weights矩阵和regVal(正则化项)。根据本轮迭代中的gradient和loss的变化以及正则化项计算更新之后的weights和regVal。
val update = pute(
weights, Vectors.fromBreeze(gradientSum / miniBatchSize.toDouble), stepSize, i, regParam)
weights = update._1
regVal = update._2
logWarning(s&Iteration ($i/$numIterations). The size of sampled batch is zero&)
logInfo(&GradientDescent.runMiniBatchSGD finished. Last 10 stochastic losses %s&.format(
stochasticLossHistory.takeRight(10).mkString(&, &)))
(weights, stochasticLossHistory.toArray)
L-BFGS优化算法在MLlib中的算法实现,大伙可以看一下LBFS.runLBFS详细实现,对loss function、梯度gradient的计算过程和SGD计算过程差不多,也支持Executor分布式的求解数据梯度,并更新参数,这里就不详细罗列了。在实际应用的场景中,L-BFGS比SGD更容易收敛,效果更好一些,推荐大家用L-BFGS。& &
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
原创文章,转载请注明: 转载自/tovin/p/3816289.html
本文以spark 1.0.0版本MLlib算法为准进行分析 一.代码结构 逻辑回归代码主要包含三个部分 1.classfication:逻辑回归分类器 2.optimization:优化方法,包含了随机梯度.LBFGS两种算法 3.e ...
朴素贝叶斯
用p1(x, y)表示(x, y)属于类别1的概率,P2(x, y)表示(x, y)属于类别2的概率: 如果p(c1x, y) & P(c2x, y), 那么类别为1 如果p(c1x, y) & P2(c2x, y), 那么类别为2
根据贝叶斯公式: p(cx, y) = (p(x, yc) * p(c)) / p ...
编者按:回归其实就是对已知公式的未知参数进行估计,Logistic regression是线性回归的一种,是机器学习中十分常用的一种分类算法,在互联网领域得到了广泛的应用.本文来自腾讯冯扬的博客:并行逻辑回归 ,主要从并行化的角度讨论LR的实现. CSDN推荐:欢迎免费订阅&Hadoop与大数据周刊&获取更多Hadoop技术文献.大数据技术分析. ...
数据海洋 营销预测模型的目标变量很多为一种状态或类型,如客户“买”还是“不买”.客户选择上网方式为 “宽带”还是“拨号”.营销战通道是邮件.电话.还是网络.我们把这类问题统称为 “分类”.决策树和逻辑回归都是解决“分类”问题的高手.用不同的算法解答同样的问题,自然引出了两者孰优孰劣的讨论,但迄今为止,仍然没有一个明确的结论.出现这种情况 ...
转自/archives/6343
在数据膨胀的当今社会里,海量数据中蕴含价值日渐凸显出来.如何有效的挖掘海量数据中的有效信息已经成为各个领域面临的共同问题.以互联网企业为代表的科技公司依据自身的实际需求,开始大量的应用机器学习.数据挖掘以及人工智能等算法获取海量数据中蕴含的信息,并且已经取得了很好的效果.
来源 浪新博客 | 作者 冯扬 摘要:Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.这里是:&可能性&而非数学上的&概率&,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用. 编者按:回归其实就是对已知公式的未知参数进行估计,L ...
1.1 逻辑回归算法 1.1.1 基础理论 logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测.g(z)可以将连续值映射到0和1上. 它与线性回归的不同点在于:为了将线性回归输出的很大范围的数,例如从负无穷到正无穷,压缩到0和1之间,这样的输出值表达为&可能 ...
逻辑回归(Logistic Regression)是机器学习中的一种分类模型,由于算法的简单和高效,在实际中应用非常广泛.本文作为美团机器学习InAction系列中的一篇,主要关注逻辑回归算法的数学模型和参数求解方法,最后也会简单讨论下逻辑回归和贝叶斯分类的关系,以及在多分类问题上的推广.逻辑回归问题实际工作中,我们可能会遇到如下问题:预测一个用户是否点击特 ...二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
Logistic Regression 就是一个被logistic方程归一化后的线性回归,仅此而已&至于所以用logistic而不用其它,是因为这种归一化的方法往往比较合理(人家都说自己叫logistic了嘛 呵呵),能够打压过大和过小的结果(往往是噪音),以保证主流的结果不至于被忽视。Logistic&Regression的适用性1)&可用于概率预测,也可用于分类。&&&&&&&并不是所有的机器学习方法都可以做可能性概率预测(比如SVM就不行,它只能得到1或者-1)。可能性预测的好处是结果又可比性:比如我们得到不同广告被点击的可能性后,就可以展现点击可能性最大的N个。这样以来,哪怕得到的可能性都很高,或者可能性都很低,我们都能取最优的topN。当用于分类问题时,仅需要设定一个阈值即可,可能性高于阈值是一类,低于阈值是另一类。2)&仅能用于线性问题&&&&&&&只有在feature和target是线性关系时,才能用Logistic&Regression(不像SVM那样可以应对非线性问题)。这有两点指导意义,一方面当预先知道模型非线性时,果断不使用Logistic&Regression;&另一方面,在使用Logistic&Regression时注意选择和target呈线性关系的feature。3)&各feature之间不需要满足条件独立假设,但各个feature的贡献是独立计算的。&&&&&&&逻辑回归不像朴素贝叶斯一样需要满足条件独立假设(因为它没有求后验概率)。但每个feature的贡献是独立计算的,即LR是不会自动帮你combine&不同的features产生新feature的&(时刻不能抱有这种幻想,那是决策树,LSA,&pLSA,&LDA或者你自己要干的事情)。举个例子,如果你需要TF*IDF这样的feature,就必须明确的给出来,若仅仅分别给出两维&TF&和&IDF&是不够的,那样只会得到类似&a*TF&+&b*IDF&的结果,而不会有&c*TF*IDF&的效果。基本介绍LR分类器(Logistic Regression Classifier),在分类情形下,经过学习之后的LR分类器其实就是一组权值w0,w1,w2,...,wm.当测试样本集中的测试数据来到时,这一组权值按照与测试数据线性加和的方式,求出一个z值:z = w0+ w1 * x1 + w2 * x2 + ... + wm * xm 。(其中x1,x2,...,xm是样本数据的各个特征,维度为m)之后按照sigmoid函数的形式求出:sigma(z) = 1/(1+exp(z))由于sigmoid函数的定义域是(-inf,inf),而值域为(0,1)。因此最基本的LR分类器适合对两类目标进行分类。那么LR分类器的这一组权值是如何求得的呢?这就需要涉及到极大似然估计MLE和又换算法的概念了。我们将sigmoid函数看成是样本数据的概率密度函数,每一个样本点,都可以通过上述的公式计算出其概率密度。详细描述1.逻辑回归模型1.1逻辑回归模型考虑有p个独立变量的向量x‘ = (x1,x2,x3,...,xp),设条件概率P(Y=1|x) = p为根据观测量相对于某时间发生的概率。逻辑回归模型可表示为P(Y=1|x) = pi(x) = 1/(1+exp(-g(x)))上式右侧形式的函数称为逻辑函数。下图给出其函数图象形式。其中g(x)=b0+b1x1+b2x2+...+bpxp。如果有名义变量,则将其变为dummy变量。一个具有k个取值的名义变量,将变为k-1个dummy变量。这样,有定义不发生事件的条件概率为那么,事件发生与事件不发生的概率之比为这个比值称为事件的发生比(the odds of experiencing an event),简称为odds。因为0&p&1,故odds&0。对odds取对数,即得到线性函数。1.2极大似然估计假设有n个观测样本,观测值分别为y1,y2,...,yn,设pi=P(yi=1|xi)为给定条件下得到yi=1的概率。在同样条件下得到yi=0的条件概率P(yi=0|xi) = 1-pi。于是,得到一个观测值的概率为
阅读(20663)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'逻辑回归(Logistic Regression)',
blogAbstract:'& & 今天开始学习逻辑回归算法,现记录学习过程如下:Logistic Regression 就是一个被logistic方程归一化后的线性回归,仅此而已&至于所以用logistic而不用其它,是因为这种归一化的方法往往比较合理(人家都说自己叫logistic了嘛 呵呵),能够打压过大和过小的结果(往往是噪音),以保证主流的结果不至于被忽视。Logistic&Regression的适用性1)&可用于概率预测,也可用于分类。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:4,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 广义线性回归模型 的文章

 

随机推荐