Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】

逻辑回归的代价函数如下:
J(θ)=minθ1m[i=1my(i)(log(hθ(x(i))))+(1y(i))(log(1hθ(x(i))))]+λ2mj=1nθj2

对于支持向量机来说:
log(hθ(x(i)))替换为cost1(θTx(i)),如下图:
Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】
log(1hθ(x(i)))替换为cost0(θTx(i)),如下图:
Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】
去掉1m常量以及正则项的λ参数,转而在第一项前加上C系数,则得到支持向量机的代价函数:
J(θ)=minθC[i=1my(i)cost1(θTx(i))+(1y(i))cost0(θTx(i))]+12j=1nθj2

假设函数:

hθ(x)={1,if θTx00,otherwise

不同于逻辑回归输出概率,支持向量机的假设函数直接预测y的取值。

根据cost1(θTx(i))cost0(θTx(i))的坐标图,为了最小化支持向量机(SVM)的代价函数,需满足以下条件:

{if y=1,then we want θTx1if y=0,then we want θTx1

支持向量机不仅正确地区分输入的正负样本,还加入了一个安全的间距因子,因此具有鲁棒性,也称其为大间距分类器。

在支持向量机的代价函数中:

  • C值如果设置很大,支持向量机易受到异常点的影响;
  • C值如果设置很小,支持向量机会忽略异常点的影响。

设存在两个二维向量:

u=[u1u2]v=[v1v2]

则向量的内积:uv=uTv=pu=u1v1+u2v2
p是向量v投射到u上的长度,u是向量u的长度=u12+u22
p是带符号的,若uv在坐标系内的夹角为θ(0θπ),则uv=uvcosθ

当支持向量机的代价函数中,C取值较大时,为了最小化代价函数,我们会找到令i=1my(i)cost1(θTx(i))+(1y(i))cost0(θTx(i))0的最优解,则目标函数变为

minθ12j=1nθj2{θTx(i)1if y=1θTx(i)1if y=0

进行如下简化:特征数n设为2,令θ0=0
目标函数可写作:12(θ12+θ22)=12(θ12+θ22)2=12θ2
θTx(i)=p(i)θ=θ1x1(i)+θ2x2(i)
则条件变为:

{p(i)θ1if y(i)=1p(i)θ1if y(i)=0

p(i)x(i)投射到θ的长度,θ向量与分界线垂直。
由于目标函数是令12θ2尽可能小,同时要满足条件

{p(i)θ1if y(i)=1p(i)θ1if y(i)=0

所以p(i)应尽可能大。
这就是支持向量机(SVM)能有效产生大间距分类的原因。

Kernel(核函数)
Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】
如上图所述,如果想拟合一条非线性的判别边界来区分正负样本,有两种方法:

方法1
构造多项式特征变量,如果θ0+θ1x1+θ2x2+θ3x1x2+θ4x12+θ5x22+>0,则预测y=1

方法2
只定义三个特征变量x0,x1,x2,其中x0=1,可忽略,如下图所示,用x1,x2作为坐标轴,手动选取三个点作为l(1),l(2),l(3)
Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】
给出样本x,新的特征变量定义如下:

f1=similarity(x,l(1))=exp(xl(1)22σ2)f2=similarity(x,l(2))=exp(xl(2)22σ2)f3=similarity(x,l(3))=exp(xl(3)22σ2)

similarity函数即为Kernel函数,此处为高斯核函数,可用k(x,l(i))表示。
f1为例:
f1=similarity(x,l(1))=exp(xl(1)22σ2)=exp(j=1n(xjlj(1))22σ2),忽略x0
如果xl(1)(即xl(1)很近):f1exp(022σ2)1
如果xl(1)很远:f1exp((large Number)22σ2)0
之前画的每一个点对应一个新的特征变量

本例中,假设函数为:当θ0+θ1f1+θ2f2+θ3f30时,预测y=1
假设已得到θ0=0.5,θ1=1,θ2=1,θ3=0,可以发现,样本离l(1)l(2)很近时,即f1=0f2=0时,y=1

如何选择l(1),l(2),l(3)
设给定m个训练样本(x(1),y(1)),(x(2),y(2)),,(x(m),y(m))
选择l(1)=x(1),l(2)=x(2),,l(m)=x(m)
f1=similarity(x,l(1))f2=similarity(x,l(2))
则特征向量f=[f1f2fm],可添加f0=1
对于支持向量机:给定样本集x,计算特征向量fRm+1
如果θTf0,预测y=1

如何得到θ
minθC[i=1my(i)cost1(θTf(i))+(1y(i))cost0(θTf(i))]+12j=1nθj2
此处n=m
j=1nθj2也可写作θTθ(忽略θ0),为了提升计算效率,改写成θTmθm为样本数。
不建议自己写最小化代价函数的代码,应使用成熟软件包

高斯核函数中σ参数的影响:
例:l(1)=[35]f1=exp(xl(1)22σ2)
σ2=1时:
Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】
x=[35]时,为最高点f1=1x取值离该点越远,f1越趋近于0

σ2=0.5时:
Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】
随着x取值远离l(1)f1取值的下降趋势加快。

σ2=3时:
Coursea-吴恩达-machine learning学习笔记(十二)【week 7之Support Vector Machines】
随着x取值远离l(1)f1取值的下降趋势减缓。

使用支持向量机时,参数C的影响:

  • C取值较大,低偏差,高方差。(对应λ取值小)
  • C取值较小,高偏差,低方差。(对应λ取值大)

使用支持向量机时,参数σ2的影响:

  • σ2取值较大,特征向量fi越平滑,高偏差,低方差
  • σ2取值较小,特征向量fi越陡峭,低偏差,高方差

使用SVM软件包求解参数θ(如:liblinear,libsvm):
步骤一:选择参数C
步骤二:选择核函数:

  1. 选择No kernel(也叫线性核函数)
    如果θTx0,预测y=1
    当存在n个特征值,m个样本,n很大,m很小,此时,适合使用线性核函数。
  2. 高斯核函数,fi=exp(xl(i)22σ2),l(i)=x(i)
    需选择参数σ2
    当存在n个特征值,m个样本,n很小,m很大时,适合用高斯核函数。
    如果选择高斯核函数,需要实现一个核函数:
    functionf=kernel(x1,x2)
    f=exp(x1x222σ2)
    return
    其中,f代表f(i)x1代表x(i)x2代表l(j)=x(j)
    在使用高斯函数前,需要做特征归一化,避免单一特征值对f的影响过大。
    注意:不是所有的相似度函数similarity(x,l)都是有效的核函数,需要满足默塞尔定理,确保软件包可以使用大量优化方法并快速得到参数θ
    可能会遇到的其他核函数:
    1)多项式核函数:k(x,l)=(xTl+constant)degree,当x,l都是严格非负数时使用;
    2)字符串核函数:当输入为文本或其他类型字符串时使用;
    3)卡方核函数;
    4)直方图交叉核函数。

如果有k个类别的话,一般使用内置函数,否则,训练k个SVM,每个SVM将1类与其他类区分开。

逻辑回归与SVM对比
n为特征值数量,m为训练样本数

  • 如果相对于mn很大(如n=10000,m=101000)
    使用逻辑回归,或SVM使用线性核函数;
  • 如果n很小,m中等大小(如n=11000,m=1010000)
    选择SVM使用高斯核函数;
  • 如果n很小,m很大(如n=11000,m=50000+)
    增加更多特征值,使用逻辑回归或SVM不带核函数。

对于所有情况,一个设计的很好的神经网络可能会非常有效,但训练起来很慢。

SVM优化函数是凸函数,总能找到全局最小值,或接近它的值。