- 想要深度理解可以参考这个论文链接
一、算法背景:
后来人们提出了一种想法,我在数据集上,画一个圆(超球体),使得这个圆尽可能小,但是又尽可能囊括多的数据点。 这就是典型的矛盾目标优化问题。因为圆尽可能小,就包的数据点就有可能会减少。同样想要包更多的点就需要一个更大的圆。那么针对这种问题,我们一般给出自己衡量目标的指标,然后写个目标函数优化就好了嗯。(PS:大部分算法的结果就在于这个目标函数写的好不好,如果目标函数是十分贴合实际的,往往就有比较好的算法效果)。 我们构造一个目标函数
F
(
R
,
a
⃗
,
ξ
i
)
=
R
2
+
C
∑
i
=
1
N
ξ
i
s
u
b
j
e
c
t
t
o
:
∥
(
x
⃗
i
−
a
⃗
)
∥
2
≤
R
2
+
ξ
i
∀
i
,
ξ
i
≥
0
(1)
\begin{array}{c}{F\left(R, \vec{a}, \xi_{i}\right)=R^{2}+C \sum_{i=1}^{N} \xi_{i}}\tag{1} \\ \\subject to:\\ {\left\|\left(\vec{x}_{i}-\vec{a}\right)\right\|^{2} \leq R^{2}+\xi_{i} \forall i, \xi_{i} \geq 0}\end{array}
F(R,a,ξi)=R2+C∑i=1Nξisubjectto:∥(xi−a)∥2≤R2+ξi∀i,ξi≥0(1)
注意:如果 C C C取的很大,最小化目标函数的时候ξi会几乎接近为0,允许出错的样本越少,他就会尽量偏向于找一个圆囊括尽量多的点。如果 C C C比较小,就偏向于找一个小的圆。
通过类似SVM的优化步骤,我们可以找到最优解。 类似SVM中的定义,落在超球体表明的点我们叫他Support Vector (SV) 支持向量。外部的叫做BSV。 下面是一个二维数据下的例子:
诶,人们发现圆是画出来了,但是有个问题,就是这个圆囊括了好多没用的地方,就是不够紧致(论文里面用的是tight),不能够贴切的描述整个数据的分布情况。
后来人们想到了高维空间。 大概的思路就是: 把原始的数据映射到高维空间,然后在高维空间中按照上述方法找一个超球体。然后把超球体逆映射到原始的数据空间。然后就可以得到一个轮廓 。通过之前的优化计算,和核函数代入,我们得到原始数据的一个点映射到高维空间后距离超球体圆心距离的公式:
R
(
x
⃗
)
=
∥
ϕ
(
x
⃗
)
−
μ
⃗
∥
=
1
−
2
∑
i
=
1
N
β
i
K
(
x
⃗
i
,
x
⃗
)
+
∑
i
,
j
=
1
N
β
i
β
j
K
(
x
⃗
i
,
x
⃗
j
)
(2)
\begin{aligned} R(\vec{x}) &=\|\phi(\vec{x})-\vec{\mu}\| \\ &=\sqrt{1-2 \sum_{i=1}^{N} \beta_{i} K\left(\vec{x}_{i}, \vec{x}\right)+\sum_{i, j=1}^{N} \beta_{i} \beta_{j} K\left(\vec{x}_{i}, \vec{x}_{j}\right)} \end{aligned}\tag{2}
R(x)=∥ϕ(x)−μ∥=1−2i=1∑NβiK(xi,x)+i,j=1∑NβiβjK(xi,xj)(2)
传说中的核函数技术 :把原始空间的数据映射到高维空间,然后再找一个超平面划分数据。 这里要明确一点: 核函数不是这个映射,核函数只是用来计算这个映射后的点的内积 。通过一个映射,原始数据从低维空间映射到高维空间。