LR与SVM的异同

作者: MapleLeaff | 来源:发表于2017-01-17 08:22 被阅读899次

    原文:http://blog.sina.com.cn/s/blog_818f5fde0102vvpy.html

    在大大小小的面试过程中,多次被问及这个问题:“请说一下逻辑回归(LR)和支持向量机(SVM)之间的相同点和不同点”。第一次被问到这个问题的时候,含含糊糊地说了一些,大多不在点子上,后来被问得多了,慢慢也就理解得更清楚了,所以现在整理一下,希望对以后面试机器学习方向的同学有所帮助(至少可以瞎扯几句,而不至于哑口无言ha(*^-^*))。

    (1)为什么将LR和SVM放在一起来进行比较?

    回答这个问题其实就是回答LR和SVM有什么相同点。

    第一,LR和SVM都是分类算法。

    看到这里很多人就不会认同了,因为在很大一部分人眼里,LR是回归算法。我是非常不赞同这一点的,因为我认为判断一个算法是分类还是回归算法的唯一标准就是样本label的类型,如果label是离散的,就是分类算法,如果label是连续的,就是回归算法。很明显,LR的训练数据的label是“0或者1”,当然是分类算法。其实这样不重要啦,暂且迁就我认为他是分类算法吧,再说了,SVM也可以回归用呢。

    第二,如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的。

    这里要先说明一点,那就是LR也是可以用核函数的,至于为什么通常在SVM中运用核函数而不在LR中运用,后面讲到他们之间区别的时候会重点分析。总之,原始的LR和SVM都是线性分类器,这也是为什么通常没人问你决策树和LR什么区别,决策树和SVM什么区别,你说一个非线性分类器和一个线性分类器有什么区别?

    第三,LR和SVM都是监督学习算法。

    这个就不赘述什么是监督学习,什么是半监督学习,什么是非监督学习了。

    第四,LR和SVM都是判别模型。

    判别模型会生成一个表示P(Y|X)的判别函数(或预测模型),而生成模型先计算联合概率p(Y,X)然后通过贝叶斯公式转化为条件概率。简单来说,在计算判别模型时,不会计算联合概率,而在计算生成模型时,必须先计算联合概率。或者这样理解:生成算法尝试去找到底这个数据是怎么生成的(产生的),然后再对一个信号进行分类。基于你的生成假设,那么那个类别最有可能产生这个信号,这个信号就属于那个类别。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。常见的判别模型有:KNN、SVM、LR,常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。当然,这也是为什么很少有人问你朴素贝叶斯和LR以及朴素贝叶斯和SVM有什么区别(哈哈,废话是不是太多)。

    第五,LR和SVM在学术界和工业界都广为人知并且应用广泛。

    讲完了LR和SVM的相同点,你是不是也认为有必要将他们进行比较一下了呢?而且比较LR和SVM,是不是比让你比较决策树和LR、决策树和SVM、朴素贝叶斯和LR、朴素贝叶斯和SVM更能考察你的功底呢?

    (2)LR和SVM的不同。

    第一,本质上是其loss function不同。

    逻辑回归的损失函数

    支持向量机的目标函数

    不同的loss function代表了不同的假设前提,也就代表了不同的分类原理,也就代表了一切!!!简单来说,​逻辑回归方法基于概率理论,假设样本为1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值,具体细节参考http://blog.csdn.net/pakko/article/details/37878837。支持向量机​基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面,具体细节参考http://blog.csdn.net/macyang/article/details/38782399

    第二,支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用)。

    当​你读完上面两个网址的内容,深入了解了LR和SVM的原理过后,会发现影响SVM决策面的样本点只有少数的结构支持向量,当在支持向量外添加或减少任何样本点对分类决策面没有任何影响;而在LR中,每个样本点都会影响决策面的结果。用下图进行说明:

    支持向量机改变非支持向量样本并不会引起决策面的变化

    逻辑回归中改变任何样本都会引起决策面的变化

    ​理解了这一点,有可能你会问,然后呢?有什么用呢?有什么意义吗?对使用两种算法有什么帮助么?一句话回答:

    因为上面的原因,得知:线性SVM不直接依赖于数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。​(引自http://www.zhihu.com/question/26768865/answer/34078149

    第三,在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法。

    ​这个问题理解起来非常简单。分类模型的结果就是计算决策面,模型训练的过程就是决策面的计算过程。通过上面的第二点不同点可以了解,在计算决策面时,SVM算法里只有少数几个代表支持向量的样本参与了计算,也就是只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。然而,LR算法里,每个样本点都必须参与决策面的计算过程,也就是说,假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。所以,在具体应用时,LR很少运用核函数机制。​

    第四,​线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization,LR不受其影响。(引自http://www.zhihu.com/question/26768865/answer/34078149

    一个机遇概率,一个机遇距离!​

    第五,SVM的损失函数就自带正则!!!(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因!!!而LR必须另外在损失函数上添加正则项!!!

    以前一直不理解为什么SVM叫做结构风险最小化算法,所谓结构风险最小化,意思就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,从而达到真实误差的最小化。未达到结构风险最小化的目的,最常用的方法就是添加正则项,后面的博客我会具体分析各种正则因子的不同,这里就不扯远了。但是,你发现没,SVM的目标函数里居然自带正则项!!!再看一下上面提到过的SVM目标函数:

    SVM目标函数​有木有,那不就是L2正则项吗?

    不用多说了,如果不明白看看L1正则与L2正则吧,参考http://www.mamicode.com/info-detail-517504.html​

    http://www.zhihu.com/question/26768865/answer/34078149

    逻辑回归(logistic regression)和支持向量机(SVM)的比较

    Liblinear支持两个热门的二元线性分类器:常规逻辑回归LR和线性SVM。给出一组实例标签(xi,yi),i=1,...l,xi∈Rn,yi∈{-1,1},这两个分类器使用了不同的损失算法解决下面的约束优化问题。其中,C是大于0的惩罚因子。对于SVM来说,有两个常用的损失算法max(1-yiwTxi,0)和max(1-yiwTxi,0)2,分别指的是L1-SVM和L2-SVM。对LR来说,损失算法是log(1+e-yiwTxi),得自一个概率模型。在有些案例中,分类器的判别式还要包含一个偏差项b。Liblinear通过对每个实例和纬度加强影响来实现偏差:wT<-[wT,b],XiT<-[XiT,B].其中B是用户指定的常量。与此不同,L1-SVM和L2-SVM的算法是坐标下降法。Liblinear为L2-SVM和LR都实现了信任区域的牛顿方法。在测试阶段,我们预测一个数据点上x>0,如果WTx>0.对于多元实例训练,我们为之提供了1Vrest的策略。

    无意间看到上面这段话,想起了那天吃饭的时候一个同事说他碰到一个面试题目是: svm 和 lr 的异同,当时思考了一下,之后想起了曾经在学习logistic regression classification model的梯度的时候,推到和一个简单的两层的sigmoid输出的的梯度是一样,后来发现神经网络拟合的时候,我们用的是均方误差的loss function ,而在这个lr 的推倒的时候,我同样用了均方误差的loss,因此得到一样的结果,但是通常在lr的推倒的时候,我们是直接用 最大似然估计的,然后只有当 误差的分布满足高斯分布的时候,最大似然的结果才会和最小二乘相同(loss function 为均方误差)

    刚才看到上面的loss function 的形式,想到了cross entropy loss,在网上找到这篇文章印证了这个

    http://www.cs.mcgill.ca/~dprecup/courses/ML/Lectures/ml-lecture05.pdf,不做这个ppt中的lable是0和1,所以和上面的公式有所不同,表达形式没有那么漂亮,但是是一样的,有时间再把这几个公式整理一下吧。

    lr 和 svm本质不同在于loss function的不同,不过想想这几乎对所有的单层模型都使用,lr的损失函数是 cross entropy loss, adaboost的损失函数是 expotional loss ,svm是hinge loss,常见的回归模型通常用 均方误差 loss。

    损失函数

    损失函数,一般由两项组成,一项是loss term,另外一项是regularization term。

    J=L+R

    先说损失项loss,再说regularization项。

    1. 分对得分1,分错得分0.gold  standard

    2. hinge loss(for softmargin svm),J=1/2||w||^2 +sum(max(0,1-yf(w,x)))

    3. log los, cross entropy loss function in logistic regression model.J=lamda||w||^2+sum(log(1+e(-yf(wx))))

    4. squared loss, in linear regression. loss=(y-f(w,x))^2

    5. exponential loss in boosting. J=lambda*R+exp(-yf(w,x))

    再说regularization项,

    一般用的多的是R2=1/2||w||^2,R1=sum(|w|)。R1和R2是凸的,同时R1会使得损失函数更加具有sparse,而R2则会更加光滑些。具体可以参见下图:

    caffe的损失函数,目前已经囊括了所有可以用的了吧,损失函数由最后一层分类器决定,同时有时会加入regularization,在BP过程中,使得误差传递得以良好运行。

    contrastive_loss,对应contrastive_loss_layer,我看了看代码,这个应该是输入是一对用来做验证的数据,比如两张人脸图,可能是同一个人的(正样本),也可能是不同个人(负样本)。在caffe的examples中,siamese这个例子中,用的损失函数是该类型的。该损失函数具体数学表达形式可以参考lecun的文章Dimensionality Reduction by Learning an Invariant Mapping, Raia Hadsell, Sumit Chopra, Yann LeCun, cvpr 2006.

    euclidean_loss,对应euclidean_loss_layer,该损失函数就是l=(y-f(wx))^2,是线性回归常用的损失函数。

    hinge_loss,对应hinge_loss_layer,该损失函数就是。主要用在SVM分类器中。

    infogain_loss,对应infogain_loss_layer,损失函数表达式没找到,只知道这是在文本处理中用到的损失函数。

    multinomial_logistic_loss,对应multinomial_logistic_loss_layer,

    sigmoid_cross_entropy,对应sigmoid_cross_entropy_loss_layer,也就是logistic regression使用的损失函数。

    softmax_loss,对应softmax_loss_layer,损失函数等可以见UFLDL中关于softmax章节。在caffe中多类分类问题,损失函数就是softmax_loss,比如imagenet, mnist等。softmax_loss是sigmoid的多类问题。但是,我就没明白,multinomial_logistic_loss和这个有什么区别,看代码,输入有点差别,softmax的输入是probability,而multinomial好像不要求是probability,但是还是没明白,如果只是这样,岂不是一样啊?

    这里详细说明了两者之间的差异,并且有详细的测试结果,非常赞。简单理解,multinomial 是将loss分成两个层进行,而softmax则是合在一起了。或者说,multinomial loss是按部就班的计算反向梯度,而softmax则是把两个步骤直接合并为一个步骤进行了,减少了中间的精度损失等 ,从计算稳定性讲,softmax更好,multinomial是标准做法,softmax则是一种优化吧。

    相关文章

      网友评论

      本文标题:LR与SVM的异同

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