逻辑回归的代价函数如下:
J(θ)=minθ1m[∑i=1my(i)(−log(hθ(x(i))))+(1−y(i))(−log(1−hθ(x(i))))]+λ2m∑j=1nθ2j
J
(
θ
)
=
min
θ
1
m
[
∑
i
=
1
m
y
(
i
)
(
−
l
o
g
(
h
θ
(
x
(
i
)
)
)
)
+
(
1
−
y
(
i
)
)
(
−
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
对于支持向量机来说:
将
−log(hθ(x(i)))
−
l
o
g
(
h
θ
(
x
(
i
)
)
)
替换为
cost1(θTx(i))
c
o
s
t
1
(
θ
T
x
(
i
)
)
,如下图:
将
−log(1−hθ(x(i)))
−
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
替换为
cost0(θTx(i))
c
o
s
t
0
(
θ
T
x
(
i
)
)
,如下图:
去掉
1m
1
m
常量以及正则项的
λ
λ
参数,转而在第一项前加上
C
C
系数,则得到支持向量机的代价函数:
假设函数:
不同于逻辑回归输出概率,支持向量机的假设函数直接预测 y y 的取值。
根据及 cost0(θTx(i)) c o s t 0 ( θ T x ( i ) ) 的坐标图,为了最小化支持向量机(SVM)的代价函数,需满足以下条件:
支持向量机不仅正确地区分输入的正负样本,还加入了一个安全的间距因子,因此具有鲁棒性,也称其为大间距分类器。
在支持向量机的代价函数中:
- C C 值如果设置很大,支持向量机易受到异常点的影响;
- 值如果设置很小,支持向量机会忽略异常点的影响。
设存在两个二维向量:
则向量的内积:
u⋅v=uT∗v=p∗∥u∥=u1∗v1+u2∗v2
u
⋅
v
=
u
T
∗
v
=
p
∗
‖
u
‖
=
u
1
∗
v
1
+
u
2
∗
v
2
p
p
是向量投射到
u
u
上的长度,是向量
u
u
的长度
p
p
是带符号的,若与
v
v
在坐标系内的夹角为,则
u⋅v=∥u∥∗∥v∥∗cosθ
u
⋅
v
=
‖
u
‖
∗
‖
v
‖
∗
c
o
s
θ
当支持向量机的代价函数中, C C 取值较大时,为了最小化代价函数,我们会找到令为 0 0 的最优解,则目标函数变为
进行如下简化:特征数
n
n
设为2,令
目标函数可写作:
12(θ21+θ22)=12(θ21+θ22−−−−−−√)2=12∥θ∥2
1
2
(
θ
1
2
+
θ
2
2
)
=
1
2
(
θ
1
2
+
θ
2
2
)
2
=
1
2
‖
θ
‖
2
θTx(i)=p(i)⋅∥θ∥=θ1x(i)1+θ2x(i)2
θ
T
x
(
i
)
=
p
(
i
)
⋅
‖
θ
‖
=
θ
1
x
1
(
i
)
+
θ
2
x
2
(
i
)
则条件变为:
p(i)
p
(
i
)
为
x(i)
x
(
i
)
投射到
θ
θ
的长度,
θ
θ
向量与分界线垂直。
由于目标函数是令
12∥θ∥2
1
2
‖
θ
‖
2
尽可能小,同时要满足条件
所以
p(i)
p
(
i
)
应尽可能大。
这就是支持向量机(SVM)能有效产生大间距分类的原因。
Kernel
K
e
r
n
e
l
(核函数):
如上图所述,如果想拟合一条非线性的判别边界来区分正负样本,有两种方法:
方法1:
构造多项式特征变量,如果
θ0+θ1x1+θ2x2+θ3x1x2+θ4x21+θ5x22+⋯>0
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
x
2
+
θ
4
x
1
2
+
θ
5
x
2
2
+
⋯
>
0
,则预测
y=1
y
=
1
。
方法2:
只定义三个特征变量
x0,x1,x2
x
0
,
x
1
,
x
2
,其中
x0=1
x
0
=
1
,可忽略,如下图所示,用
x1,x2
x
1
,
x
2
作为坐标轴,手动选取三个点作为
l(1),l(2),l(3)
l
(
1
)
,
l
(
2
)
,
l
(
3
)
:
给出样本
x
x
,新的特征变量定义如下:
similarity
s
i
m
i
l
a
r
i
t
y
函数即为
Kernel
K
e
r
n
e
l
函数,此处为高斯核函数,可用
k(x,l(i))
k
(
x
,
l
(
i
)
)
表示。
以
f1
f
1
为例:
f1=similarity(x,l(1))=exp(−∥x−l(1)∥22σ2)=exp(−∑j=1n(xj−l(1)j)22σ2)
f
1
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
1
)
)
=
e
x
p
(
−
‖
x
−
l
(
1
)
‖
2
2
σ
2
)
=
e
x
p
(
−
∑
j
=
1
n
(
x
j
−
l
j
(
1
)
)
2
2
σ
2
)
,忽略
x0
x
0
如果
x≈l(1)
x
≈
l
(
1
)
(即
x
x
离很近):
f1≈exp(−022σ2)≈1
f
1
≈
e
x
p
(
−
0
2
2
σ
2
)
≈
1
如果
x
x
离很远:
f1≈exp(−(large Number)22σ2)≈0
f
1
≈
e
x
p
(
−
(
l
a
r
g
e
N
u
m
b
e
r
)
2
2
σ
2
)
≈
0
之前画的每一个点对应一个新的特征变量。
本例中,假设函数为:当
θ0+θ1f1+θ2f2+θ3f3⩾0
θ
0
+
θ
1
f
1
+
θ
2
f
2
+
θ
3
f
3
⩾
0
时,预测
y=1
y
=
1
假设已得到
θ0=−0.5,θ1=1,θ2=1,θ3=0
θ
0
=
−
0.5
,
θ
1
=
1
,
θ
2
=
1
,
θ
3
=
0
,可以发现,样本离
l(1)
l
(
1
)
或
l(2)
l
(
2
)
很近时,即
f1=0
f
1
=
0
或
f2=0
f
2
=
0
时,
y=1
y
=
1
如何选择
l(1),l(2),l(3)⋯
l
(
1
)
,
l
(
2
)
,
l
(
3
)
⋯
?
设给定
m
m
个训练样本
选择
l(1)=x(1),l(2)=x(2),⋯,l(m)=x(m)
l
(
1
)
=
x
(
1
)
,
l
(
2
)
=
x
(
2
)
,
⋯
,
l
(
m
)
=
x
(
m
)
f1=similarity(x,l(1))f2=similarity(x,l(2))⋯
f
1
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
1
)
)
f
2
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
2
)
)
⋯
则特征向量
f=⎡⎣⎢⎢⎢f1f2⋯fm⎤⎦⎥⎥⎥
f
=
[
f
1
f
2
⋯
f
m
]
,可添加
f0=1
f
0
=
1
对于支持向量机:给定样本集
x
x
,计算特征向量
如果
θTf⩾0
θ
T
f
⩾
0
,预测
y=1
y
=
1
如何得到
θ
θ
?
minθC[∑i=1my(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+12∑j=1nθ2j
min
θ
C
[
∑
i
=
1
m
y
(
i
)
c
o
s
t
1
(
θ
T
f
(
i
)
)
+
(
1
−
y
(
i
)
)
c
o
s
t
0
(
θ
T
f
(
i
)
)
]
+
1
2
∑
j
=
1
n
θ
j
2
此处
n=m
n
=
m
∑j=1nθ2j
∑
j
=
1
n
θ
j
2
也可写作
θTθ
θ
T
θ
(忽略
θ0
θ
0
),为了提升计算效率,改写成
θTmθ
θ
T
m
θ
,
m
m
为样本数。
不建议自己写最小化代价函数的代码,应使用成熟软件包。
高斯核函数中参数的影响:
例:
l(1)=[35]
l
(
1
)
=
[
3
5
]
,
f1=exp(−∥x−l(1)∥22σ2)
f
1
=
e
x
p
(
−
‖
x
−
l
(
1
)
‖
2
2
σ
2
)
当
σ2=1
σ
2
=
1
时:
x=[35]
x
=
[
3
5
]
时,为最高点
f1=1
f
1
=
1
,
x
x
取值离该点越远,越趋近于
0
0
。
当时:
随着
x
x
取值远离,
f1
f
1
取值的下降趋势加快。
当
σ2=3
σ
2
=
3
时:
随着
x
x
取值远离,
f1
f
1
取值的下降趋势减缓。
使用支持向量机时,参数 C C 的影响:
- 取值较大,低偏差,高方差。(对应
λ
λ
取值小)
- C C 取值较小,高偏差,低方差。(对应取值大)
使用支持向量机时,参数 σ2 σ 2 的影响:
- σ2 σ 2 取值较大,特征向量 fi f i 越平滑,高偏差,低方差
- σ2 σ 2 取值较小,特征向量 fi f i 越陡峭,低偏差,高方差
使用SVM软件包求解参数 θ θ (如: liblinear,libsvm l i b l i n e a r , l i b s v m ):
步骤一:选择参数 C C
步骤二:选择核函数:- 选择(也叫线性核函数)
如果 θTx⩾0 θ T x ⩾ 0 ,预测 y=1 y = 1
当存在 n n 个特征值,个样本, n n 很大,很小,此时,适合使用线性核函数。 - 高斯核函数,
fi=exp(−∥x−l(i)∥22σ2),l(i)=x(i)
f
i
=
e
x
p
(
−
‖
x
−
l
(
i
)
‖
2
2
σ
2
)
,
l
(
i
)
=
x
(
i
)
需选择参数 σ2 σ 2
当存在 n n 个特征值,个样本, n n 很小,很大时,适合用高斯核函数。
如果选择高斯核函数,需要实现一个核函数:
functionf=kernel(x1,x2) f u n c t i o n f = k e r n e l ( x 1 , x 2 )
f=exp(−∥x1−x2∥22σ2) f = e x p ( − ‖ x 1 − x 2 ‖ 2 2 σ 2 )
return r e t u r n
其中, f f 代表, x1 x 1 代表 x(i) x ( i ) , x2 x 2 代表 l(j)=x(j) l ( j ) = x ( j )
在使用高斯函数前,需要做特征归一化,避免单一特征值对 f f 的影响过大。
注意:不是所有的相似度函数都是有效的核函数,需要满足默塞尔定理,确保软件包可以使用大量优化方法并快速得到参数 θ θ 。
可能会遇到的其他核函数:
1)多项式核函数: k(x,l)=(xTl+constant)degree k ( x , l ) = ( x T l + c o n s t a n t ) d e g r e e ,当 x,l x , l 都是严格非负数时使用;
2)字符串核函数:当输入为文本或其他类型字符串时使用;
3)卡方核函数;
4)直方图交叉核函数。 如果有 k k 个类别的话,一般使用内置函数,否则,训练个SVM,每个SVM将 1 1 类与其他类区分开。
逻辑回归与SVM对比:
为特征值数量, m m 为训练样本数- 如果相对于,
n
n
很大(如)
使用逻辑回归,或SVM使用线性核函数; - 如果
n
n
很小,中等大小(如
n=1∼1000,m=10∼10000
n
=
1
∼
1000
,
m
=
10
∼
10000
)
选择SVM使用高斯核函数; - 如果
n
n
很小,很大(如
n=1∼1000,m=50000+
n
=
1
∼
1000
,
m
=
50000
+
)
增加更多特征值,使用逻辑回归或SVM不带核函数。 对于所有情况,一个设计的很好的神经网络可能会非常有效,但训练起来很慢。
SVM优化函数是凸函数,总能找到全局最小值,或接近它的值。
- 如果相对于,
n
n
很大(如)