LR和SVM的相关理解


In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

LR的sigmoid函数

  • sigmoid函数如下

In [3]:
def h(z):
    return 1/(1+np.exp(-z))

In [4]:
z = np.arange(-10,10,0.01)
y = h(z)
plt.plot(z,y,linewidth=2.5,)
plt.ylabel(r'$h_\theta (x)$',fontsize=20)
plt.xlabel(r'$\theta^T\dotX$',fontsize=20)
plt.scatter(0,0.5)
plt.annotate(r'$(0,\,0.5)$',xy=(0.2,0.5),fontsize=20)
plt.show()


LR目标函数的凸性证明

LR的目标函数(对数损失函数,或者交叉熵)是:

$$\underset{\theta}{minimize}\;L(\theta) = -\underset{i=0}{\overset{m}\sum}y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)})),\qquad\text{$y \in\{0,1\}$ }$$

因此目标函数的一次导数和二次导数分别为:

$$L^{'}(\theta) = -\underset{i=0}{\overset{m}\sum}(y^{(i)}-h_\theta(x^{(i)}))x^{(i)}$$

$$L^{''}(\theta) = \underset{i=0}{\overset{m}\sum}h_\theta(x^{(i)})(1-h_\theta(x^{(i)}))(x^{(i)})^2 > 0$$

由于目标函数的二次导数恒大于0,因此可知LR的目标函数是一个凸函数。

LR中的函数间隔


In [5]:
N = [1,1,2,2]
P = [4,4,5,5]
Y = [1,2,1,2,3,4,3,4]
plt.scatter(N,Y[:4],s=80,marker='x')
plt.scatter(P,Y[4:],s=100,marker='+',color='red')
x=np.arange(2,4,0.01)
x2=np.arange(2,3.2,0.01)
plt.plot(x,-2*x+8,color='green')
plt.plot(x2,0.5*x2)
plt.axis('equal')
plt.annotate(r'$\frac{\theta^TX}{||\theta||}$',
             xy=(2.4,0.6),fontsize=20
             )
plt.show()


  • 上图中所示的为几何距离。实际上,在LR模型里,如果将y取值设定为-1和1的话,对数损失也可以用如下形式表征

    $$P(y|x) = \frac{1}{1+e^{-y\theta^TX}},\qquad\text{$y \in\{-1,1\}$ }$$

  • 目标函数可以表示成如下形式:

    $$l(\theta) = -log(p(y|x)) = log(1+e^{-y\theta^TX})$$

  • 而LR里跟距离有关的便是$\theta^TX$,只不过在这里表示成函数距离的形式,即$y\theta^TX$。

  • 因此,如果把$y\theta^TX$看做函数距离,从这个角度来考虑LR的话,可以认为LR也是一个跟距离有关的分类器,只不过将距离通过一个sigmoid函数映射到(0,1)区间。假定在原始特征空间中的分类界面为$\theta^T\cdot X = 0$,那么当样本点被分类正确且离这个决策面越远,在表达式中体现为$y\theta^TX$越大,因而损失越小。

LR和SVM损失函数的比较

  • SVM的损失函数可以表示如下:

    $$\underset{w,b}{minimize}\;L(w,b) = \underset{i=1}{\overset{m}{\sum}}[1-y^{(i)}(w^T\cdot x^{(i)}+b)]_++\lambda||w||^2$$

  • 等式右边第一项便是合页损失。将合页损失与LR的对数损失画在同一坐标系下时如下:


In [6]:
loss = -np.log2(h(z))#这里特别用2为底的对数,主要是为了和SVM进行统一尺度的损失函数比较
plt.plot(z,loss,linewidth=2.5)
plt.plot(z,-z+1,linewidth=2.5,color='red')
plt.plot([1,5],[0,0],linewidth=3.5,color='red')
plt.plot([-5,0],[1,1],linewidth=2.5,color='green')
plt.plot([0,0],[0,1],linewidth=2.5,color='green')
plt.plot([0,5],[0,0],linewidth=2.5,color='green')
plt.title(r'$hinge\;loss\;and\;logistic\;loss$',fontsize=20)
plt.xlim(-5,5)
plt.ylim(0,6)
plt.grid()
plt.scatter(0,1)
plt.annotate(r'$LR$',xy=(-3.5,5.5),fontsize=20)
plt.annotate(r'$SVM$',xy=(-4.8,4),fontsize=20)
plt.annotate(r'$0-1\;LOSS$',xy=(-4.5,1.2),fontsize=20)
plt.annotate(r'$(0,1)$',xy=(0,1.2),fontsize=20)
plt.ylabel(r'$E$',fontsize=20)
plt.xlabel(r'$y\theta^TX$',fontsize=20)
plt.show()


  • 从图中可以看出,LR和SVM的损失函数还是极其相似的(不考虑正则化项),可以认为二者都是分类问题真正的本质0-1损失函数的近似。并且是上界的一种近似。因为0-1损失不是连续可导的,直接优化其构成的目标函数比较困难,所以将其上界进行近似后,再去对该上界进行优化便可以得到原问题的解。
  • 但是,有所区别的是,$y\theta^TX>1$时,对应的是SVM中的间隔边界外的样本点,或者说非支持向量的那些样本点,这些样本点对损失函数的贡献为0,而LR却仍然会有一个小于1的损失。

将LR中的$\theta$增大,会发生什么有趣的事情?

  • 在下面这个图中,保持每一个样本不变,即x和y都不变(这里为了方便把样本定义在一个一维特征空间上),仅仅把参数$\theta$增大,可以发现得到损失函数曲线越来越陡峭。在分类正确的样本中,损失也越来越小,即对于$y\theta^Tx>0$这一侧,损失越来越小。

In [7]:
x = np.arange(-4,4,0.01)
for theta in np.arange(1,2,0.2):
    plt.plot(x,-np.log2(h(theta*x)),linewidth=3)
    plt.annotate(r'$\theta=%.1f$' % theta,xy=(-4,-np.log2(h(theta*-4))),fontsize=15)
plt.plot(x,-np.log2(h(100*x)),linewidth=3)
plt.annotate(r'$\theta=1000$',xy=(0,8),fontsize=20)
plt.ylim(0,11)
plt.grid()
plt.show()


  • 基于这一点,可以做如下猜测,在样本是线性可分的情况下,如果当前已经得到了一个分界面,该分界面可以完美的把线性可分的两类分开。现在,为了使得在总体样本上的损失最小,可以简单的将$\theta$翻倍即可。当$\theta$增长的时候,总可以使得整体的损失变得更小。而这一过程并没有极限。
  • 另外,线性可分的情况下,LR的分界面并不唯一,不仅表现在$\theta$可以无限增大(分界面并未变,只是$\theta$增大了),另一方面,不同的分界面也可以,因为每一个分界面在$\theta$变得足够大时,总能将损失函数变得足够小。
  • 那么如何解决这一问题?正则化。
  • 所以LR在应对线性可分情况下的时候,损失函数是一个凸函数,该凸函数有下界,但是并不收敛。

三维空间下的直观理解

  • 如果将sigmoid变换放在一个三维空间中来理解的话,可以得到如下图所示:

In [8]:
fig = plt.figure()
ax = fig.gca(projection='3d')#Axes3D(fig)
N = [-5,-5,-2,-2]
P = [4,4,8,8]
Y = [-5,-2,-5,-2,4,8,4,8]
ax.scatter(N,Y[:4],s=80)
ax.scatter(P,Y[4:],s=80,color='red')
ax.plot([-1,9],[10,-10],linewidth=3,color='green')
ax.set_autoscalez_on(False)
ax.set_zlim(0,4)
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
R = 2*X+Y-8
Z = h(R)


ax.set_xlabel(r'$x_1$',fontsize=20)
ax.set_ylabel(r'$x_2$',fontsize=20)
ax.set_zlabel(r'$h_\theta (x)$',fontsize=20)
ax.text(7,-5,0,r'$\theta^TX=0$',fontsize=15)
ax.text(5,10,1,r'$h_\theta (x)$',fontsize=20,color='red')
ax.text(-10,5,1,r'$1-h_\theta (x)$',fontsize=20,color='blue')

ax.plot_surface(X, Y, Z,alpha=0,rstride=20,cstride=20,color='yellow')
ax.plot_surface(X, Y, 1-Z,alpha=0,rstride=20,cstride=20,color='yellow')

plt.show()


  • 如上图所示,红色的和蓝色的样本点分别是正例和负例,在计算损失的时候,每个样本点先求得与直线分界面(即图中的$\theta^TX=0$直线)的函数距离,然后再把该函数距离通过sigmoid函数进行映射。
  • 映射完成后,每个样本点的损失:正例就是映射到sigmoid函数上的点与z=1平面的距离,相应的负例,就是映射到sigmoid函数上的点与z=0平面的距离。
  • 如果用极大似然估计的思路来考虑上图所示,会变得更形象一些。极大似然估计的目的是:对于正例要使得其在$h_\theta (x)$上的映射尽量的大,而对于负例要使得$1-h_\theta (x)$上的映射尽量的大。这用两种方法来达到目的。
    • 其一,使各自的映射函数即$h_\theta (x)$和$1-h_\theta (x)$越陡峭越好,这样映射的时候自然也会更大一些。体现在$\theta$变大,则sigmoid函数越陡峭。
    • 其二,在映射函数陡峭程度相同的时候,使得sigmoid函数尽量的在所有样本点上远离,也就是平均意义上的最大间隔分类器。和SVM不同的是,SVM主要选一些支持向量来考察这个最大间隔。而LR则考虑了所有的点。这一点,体现在决策边界$\theta^TX=0$尽量在所有样本点上远离。

线性不可分情况

  • 上面的讨论都是基于线性可分情况下的,实际上,加入了正则化项的LR和linear SVM一般说来差别不大,但是LR相比下更简单。线性不可分的时候,SVM天然有优势,因为其可以非常方便的借助于核函数将特征空间内的样本映射到另一个空间内,然后再利用线性分类器的方法找到决策界面。而相比之下,LR应对线性不可分的情况便要费力得多,即便借助于核函数,在效果上也要比SVM差一些。

LR和SVM的其他一些比较

  • LR属于广义线性模型。并且假定模型的输出Y符合Bernoulli分布。SVM则自成一个模型。
  • LR更注重预测样本的概率值,也就是说LR是一个概率模型,而SVM则只关注分类正确与否,是一个判别模型。
  • LR和SVM在处理线性可分的情况下的时候,一般性能差不多,但是针对非线性可分情况SVM则要优于LR,SVM借助核方法引入非线性非常方便。
  • LR更容易过拟合,而SVM由于其VC维较低,模型只需要一些极少量的样本便可以进行训练,所以相对来说过拟合风险稍低些。