KCF 算法推导
第一部分 线性可分
分类器建立
我们从一个故事开始讲起。
在青青草原上有两个村子,一个是羊村,一个是狼村。为了防止狼村的灰太狼们过来吃羊,在杨村要修一个栅栏。如图所示,这个栅栏修成一个直的就好。如果这条笔直的栅栏,能将两个村子分开,我们就称其为线性可分,这条栅栏,用线性函数来表示: f ( x ) = W T x f(x)=W^Tx f(x)=WTx 。
栅栏下方的是羊村,栅栏上方的是狼村。用函数表示就是: f ( 喜 羊 羊 ) = W T ( 喜 羊 羊 ) < 0 ( 羊 村 ) f(喜羊羊)=W^T(喜羊羊)<0(羊村) f(喜羊羊)=WT(喜羊羊)<0(羊村), f ( 灰 太 狼 ) = W T ( 灰 太 狼 ) > 0 ( 狼 村 ) f(灰太狼)=W^T(灰太狼)>0(狼村) f(灰太狼)=WT(灰太狼)>0(狼村)。
可以看出,由于输入的不同,所得到的分类结果也不同。这是一个非正即负的二分类方法。假设草原上新来一只羊,那么它应该被分到羊村,否则就是羊入狼口了。
重新整理一下,在草原上已经存在的羊群 🐑 ,和狼群🐺之间,我们建了一个直线的栅栏 f ( x ) f(x) f(x) ,将两村分开。对于新来到草原的动物,如果是羊,就根据栅栏建立的规则,划分到羊村,反之亦然。可以看出,栅栏 f ( x ) f(x) f(x) 既是两村的划分,又是草原上动物的归类标准。假设输入的动物是 x i x_i xi ,输出的分类是 y i y_i yi ,他们之间的关系是: f ( x i ) = W T x i = y i f(x_i)=W^Tx_i=y_i f(xi)=WTxi=yi。
判断一只动物的归属,当然要从它的生理特征来入手,比如手脚的数目,直立行走,毛发颜色,生活习性等方面,这些作为动物的特征属性,如果为每个属性都建立一个标记,假设这些属性的数量是 d d d,用数学语言表示就是: x i = [ x i 1 , … , x i d ] x_i=[x_{i1},\ldots,x_{id}] xi=[xi1,…,xid] (这里是行向量),而 W W W 可以看成这些属性,在判断动物类别上的权重,因此也是 d d d 维的。由于并不是没种属性对判断动物种类的重要性都相等,比如双足行走这个特征对区别喜洋洋和灰太狼来说就并没有很重要的意义。
当然,归类可能不那么准确,一个好的分类器就是要让尽可能让分类结果准确,否则就会有羊羊 🐑 被吃掉。
为了评判分类器的好坏,我们建立一个名为损失函数的东西:
L
o
s
s
=
∑
i
=
1
n
∣
∣
W
T
x
i
−
y
i
∣
∣
2
+
λ
∣
∣
W
∣
∣
2
Loss=\sum_{i=1}^n||W^Tx_i-y_i||^2+\lambda||W||^2
Loss=i=1∑n∣∣WTxi−yi∣∣2+λ∣∣W∣∣2
这里的
λ
\lambda
λ 只是为了让结果中的分母不出现 0。
我们期望的结果是损失函数的结果为0,即分类器中没有损失。再来看,这个分类器中,只有一个未知数
W
W
W(
λ
\lambda
λ是个非常小的数,不起到决定作用,可以不用考虑)。损失函数看形式,一定是个非负数(是个二次项)。那么函数的最小值,一定在导数为0的部分。先对损失函数整理一下,让它在形式上更好看一些。假设有一个向量
c
c
c,它的每一项
c
i
=
W
T
x
i
−
y
i
c_i=W^Tx_i-y_i
ci=WTxi−yi, 则
∑
i
=
1
n
∣
∣
W
T
x
i
−
y
i
∣
∣
2
=
∑
i
=
1
n
c
i
2
=
<
c
,
c
>
=
∣
∣
c
∣
∣
2
\sum_{i=1}^n||W^Tx_i-y_i||^2=\sum_{i=1}^{n}c_i^2=<c,c>=||c||^2
∑i=1n∣∣WTxi−yi∣∣2=∑i=1nci2=<c,c>=∣∣c∣∣2,这里面用到了向量各元素平方和,就是向量内积,也是向量的2范数。又假设
X
=
[
x
1
,
⋯
,
x
n
]
T
X=[x_1,\cdots,x_n]^T
X=[x1,⋯,xn]T,
y
=
[
y
1
,
⋯
,
y
n
]
T
y=[y_1,\cdots,y_n]^T
y=[y1,⋯,yn]T,两个都是列向量。
W
,
x
i
W,x_i
W,xi 是
d
d
d 维,即
x
i
=
[
x
i
1
,
⋯
,
x
i
d
]
T
x_i=[x_{i1},\cdots,x_{id}]^T
xi=[xi1,⋯,xid]T,
W
=
[
w
1
,
⋯
,
w
d
]
T
W=[w_1,\cdots,w_d]^T
W=[w1,⋯,wd]T。
c
=
[
w
1
x
11
+
⋯
+
w
d
x
1
d
−
y
1
⋯
w
1
x
n
1
+
⋯
+
w
d
x
n
d
−
y
n
]
=
[
w
1
x
11
+
⋯
+
w
d
x
1
d
⋯
w
1
x
n
1
+
⋯
+
w
d
x
n
d
]
−
[
y
1
⋯
y
n
]
=
[
x
11
,
⋯
,
x
1
d
⋯
x
n
1
,
⋯
,
x
n
d
]
[
w
1
⋯
w
d
]
−
y
=
[
x
1
T
⋯
x
n
T
]
W
−
y
=
X
W
−
y
\begin{aligned} c&= \begin{bmatrix}w_{1}x_{11}+\cdots+w_dx_{1d}-y_1\\ \cdots\\w_{1}x_{n1}+\cdots+w_dx_{nd}-y_n \end{bmatrix}\\ &=\begin{bmatrix}w_{1}x_{11}+\cdots+w_dx_{1d}\\ \cdots\\w_{1}x_{n1}+\cdots+w_dx_{nd} \end{bmatrix}-\begin{bmatrix}y_1 \\\cdots\\y_n \end{bmatrix}\\ &=\begin{bmatrix}x_{11},\cdots,x_{1d}\\ \cdots\\x_{n1},\cdots,x_{nd} \end{bmatrix}\begin{bmatrix} w_1\\\cdots\\w_d\end{bmatrix}-y\\ &=\begin{bmatrix}x_{1}^T\\ \cdots\\x_{n}^T\end{bmatrix}W-y=XW-y \end{aligned}
c=⎣⎡w1x11+⋯+wdx1d−y1⋯w1xn1+⋯+wdxnd−yn⎦⎤=⎣⎡w1x11+⋯+wdx1d⋯w1xn1+⋯+wdxnd⎦⎤−⎣⎡y1⋯yn⎦⎤=⎣⎡x11,⋯,x1d⋯xn1,⋯,xnd⎦⎤⎣⎡w1⋯wd⎦⎤−y=⎣⎡x1T⋯xnT⎦⎤W−y=XW−y
这里,
X
=
[
x
11
,
⋯
,
x
1
d
⋯
x
n
1
,
⋯
,
x
n
d
]
=
[
x
1
T
⋯
x
n
T
]
n
×
d
X
T
=
[
x
11
,
x
21
,
⋯
,
x
n
1
⋯
x
1
d
,
x
2
d
,
⋯
,
x
n
d
]
d
×
n
=
[
x
1
,
⋯
,
x
n
]
d
×
n
X=\begin{bmatrix}x_{11},\cdots,x_{1d}\\ \cdots\\x_{n1},\cdots,x_{nd} \end{bmatrix}=\begin{bmatrix}x_{1}^T\\ \cdots\\x_{n}^T\end{bmatrix}_{n\times d}\\ X^T=\begin{bmatrix}x_{11},x_{21},\cdots,x_{n1}\\ \cdots\\x_{1d},x_{2d},\cdots,x_{nd}\end{bmatrix}_{d\times n}=\begin{bmatrix}x_{1}, \cdots,x_{n} \end{bmatrix}_{d\times n}\\
X=⎣⎡x11,⋯,x1d⋯xn1,⋯,xnd⎦⎤=⎣⎡x1T⋯xnT⎦⎤n×dXT=⎣⎡x11,x21,⋯,xn1⋯x1d,x2d,⋯,xnd⎦⎤d×n=[x1,⋯,xn]d×n
L o s s = ∑ i = 1 n ∣ ∣ W T x i − y i ∣ ∣ 2 + λ ∣ ∣ W ∣ ∣ 2 = ∣ ∣ X W − y ∣ ∣ 2 + λ ∣ ∣ W ∣ ∣ 2 \begin{aligned} Loss&=\sum_{i=1}^n||W^Tx_i-y_i||^2+\lambda||W||^2\\ &=||XW-y||^2+\lambda||W||^2 \end{aligned} Loss=i=1∑n∣∣WTxi−yi∣∣2+λ∣∣W∣∣2=∣∣XW−y∣∣2+λ∣∣W∣∣2
对损失函数求导,并令其导数为0,可以得到下面的关系:
L
o
s
s
=
L
1
+
L
2
L
1
=
∣
∣
X
W
−
y
∣
∣
2
=
(
X
W
−
y
)
T
(
X
W
−
y
)
=
W
T
X
X
T
W
−
y
T
X
W
−
W
T
X
T
y
+
y
T
y
L
2
=
λ
∣
∣
W
∣
∣
2
∂
L
o
s
s
∂
W
=
∂
L
1
∂
W
+
∂
L
2
∂
W
∂
L
1
∂
W
=
∂
W
T
X
X
T
W
∂
W
−
2
∂
y
T
X
W
∂
W
+
∂
y
T
y
∂
W
=
2
X
T
X
W
−
2
X
T
y
∂
L
2
∂
W
=
2
λ
W
∂
L
o
s
s
∂
W
=
2
X
T
X
W
−
2
X
T
y
+
2
λ
W
=
0
∴
W
=
(
X
T
X
+
λ
I
)
−
1
X
T
y
\begin{aligned} Loss&=L1+L2\\ L1&=||XW-y||^2=(XW-y)^T(XW-y)=W^TXX^TW-y^TXW-W^TX^Ty+y^Ty\\ L2&=\lambda||W||^2 \\ \frac{\partial Loss}{\partial W}&=\frac{\partial L1}{\partial W}+\frac{\partial L2} {\partial W}\\ \frac{\partial L1}{\partial W}&=\frac{\partial W^TXX^TW}{\partial W}-2\frac{\partial y^TXW}{\partial W}+\frac{\partial y^Ty}{\partial W} =2X^TXW-2X^Ty \\ \frac{\partial L2}{\partial W}&=2\lambda W\\ \frac{\partial Loss}{\partial W}&=2X^TXW-2X^Ty +2\lambda W=0\\ \therefore W&=(X^TX+\lambda I)^{-1}X^Ty \end{aligned}
LossL1L2∂W∂Loss∂W∂L1∂W∂L2∂W∂Loss∴W=L1+L2=∣∣XW−y∣∣2=(XW−y)T(XW−y)=WTXXTW−yTXW−WTXTy+yTy=λ∣∣W∣∣2=∂W∂L1+∂W∂L2=∂W∂WTXXTW−2∂W∂yTXW+∂W∂yTy=2XTXW−2XTy=2λW=2XTXW−2XTy+2λW=0=(XTX+λI)−1XTy
这里面,设
X
X
T
=
A
XX^T=A
XXT=A,则
∂
W
T
X
X
T
W
∂
W
=
∂
W
T
A
W
∂
W
\frac{\partial W^TXX^TW}{\partial W}=\frac{\partial W^TAW}{\partial W}
∂W∂WTXXTW=∂W∂WTAW。
∂
W
T
A
W
∂
w
k
=
∂
∑
i
=
1
n
∑
j
=
1
n
w
i
A
i
j
w
j
∂
w
k
=
∑
i
=
1
n
A
i
k
x
i
+
∑
i
=
1
n
A
k
j
x
j
\frac{\partial W^TAW}{\partial w_k}=\frac{\partial \sum_{i=1}^n\sum_{j=1}^nw_iA_{ij}w_j}{\partial w_k}=\sum_{i=1}^nA_{ik}x_i+\sum_{i=1}^nA_{kj}x_j
∂wk∂WTAW=∂wk∂∑i=1n∑j=1nwiAijwj=i=1∑nAikxi+i=1∑nAkjxj
可以求得
∂
W
T
X
X
T
W
∂
W
=
(
X
X
T
)
T
W
+
X
X
T
W
=
2
X
X
T
W
\frac{\partial W^TXX^TW}{\partial W}=(XX^T)^TW+XX^TW=2XX^TW
∂W∂WTXXTW=(XXT)TW+XXTW=2XXTW
关于矩阵求导部分,可以参考链接 机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法。
W W W 形式的化简
现在遇到一个问题,就是如果草原上原来的动物很多,每个动物的特征又很多,则分类器运算复杂度是非常高的,特别是还要进行矩阵的逆运算。如果青青草原上的这些动物,满足某些特点,这些特点再计算时可以大大简化计算量的话,那这个分类器的执行效率将会非常高。
回看分类器里
X
X
X 的组成,它是由一个个代表动物属性的特征组成:
X
=
[
x
11
,
x
12
,
…
,
x
1
d
⋯
x
n
1
,
x
n
2
,
…
,
x
n
d
]
n
×
d
\begin{aligned}X=\begin{bmatrix}x_{11},x_{12},\ldots,x_{1d}\\\cdots\\x_{n1},x_{n2},\ldots,x_{nd}\end{bmatrix}_{n\times d}\end{aligned}
X=⎣⎡x11,x12,…,x1d⋯xn1,xn2,…,xnd⎦⎤n×d
这里,用到了循环矩阵来对原分类器进行化简。
循环矩阵可以用它的第一行来表示,即
X
=
C
(
x
)
X=C(x)
X=C(x) 。这里的小写字母
x
x
x 就是矩阵
X
X
X 的第一行。比如下面这就是一种:
C
(
x
)
=
[
x
1
x
2
⋯
x
n
−
1
x
n
x
2
x
3
⋯
x
n
x
1
⋯
x
n
x
1
⋯
x
n
−
2
x
n
−
1
]
C(x)= \left[\begin{array}{ccc} x_1& x_2& \cdots& x_{n-1}& x_n\\ x_2& x_3& \cdots& x_n& x_1\\ \cdots\\ x_n& x_1& \cdots& x_{n-2}& x_{n-1}\\ \end{array}\right]
C(x)=⎣⎢⎢⎡x1x2⋯xnx2x3x1⋯⋯⋯xn−1xnxn−2xnx1xn−1⎦⎥⎥⎤
循环矩阵有很多非常好的性质,比如:
性质1:循环矩阵可以写成: X = C ( x ) = F d i a g ( x ^ ) F H X=C(x)=Fdiag(\hat x)F^H X=C(x)=Fdiag(x^)FH
这里的
x
^
\hat x
x^ 表示
x
x
x 的傅里叶变换;
F
F
F 为离散傅立叶矩阵,可以用一个复数
ω
=
e
−
2
π
i
/
n
\omega=e^{-2\pi i/n}
ω=e−2πi/n 表示,其中
n
n
n 为方阵
F
F
F 的尺寸。
F
H
F^H
FH是
F
F
F的共轭转置矩阵,
F
F
H
=
I
FF^H=I
FFH=I。
F
=
[
1
1
⋯
1
1
1
ω
⋯
ω
n
−
2
ω
n
−
1
1
ω
2
⋯
ω
2
(
n
−
2
)
ω
2
(
n
−
1
)
⋯
1
ω
n
−
1
⋯
ω
(
n
−
1
)
(
n
−
2
)
ω
(
n
−
1
)
2
]
F=\left[\begin{array}{ccc} \\1 & 1 & \cdots & 1 & 1\\ 1 & \omega&\cdots&\omega^{n-2}& \omega^{n-1}\\ 1 & \omega^{2} & \cdots & \omega^{2(n-2)} & \omega^{2(n-1)}\\&\cdots\\ 1 & \omega^{n-1}& \cdots& \omega^{(n-1)(n-2)}& \omega^{(n-1)^2}\\\end{array}\right]
F=⎣⎢⎢⎢⎢⎢⎢⎡11111ωω2⋯ωn−1⋯⋯⋯⋯1ωn−2ω2(n−2)ω(n−1)(n−2)1ωn−1ω2(n−1)ω(n−1)2⎦⎥⎥⎥⎥⎥⎥⎤
将这种形式,带入到
W
W
W 中,符号⊙表示矩阵元素级的乘法,即位置相同的各元素分别相乘。
W
=
(
X
T
X
+
λ
I
)
−
1
X
T
y
=
(
(
F
d
i
a
g
(
x
^
)
F
H
)
T
F
d
i
a
g
(
x
^
)
F
H
+
λ
F
I
F
H
)
−
1
(
F
d
i
a
g
(
x
^
)
F
H
)
T
y
=
(
F
d
i
a
g
(
x
^
∗
)
F
H
F
d
i
a
g
(
x
^
)
F
H
+
λ
F
I
F
H
)
−
1
F
d
i
a
g
(
x
^
∗
)
F
H
y
=
(
F
d
i
a
g
(
x
^
∗
)
d
i
a
g
(
x
^
)
F
H
+
λ
F
I
F
H
)
−
1
F
d
i
a
g
(
x
^
∗
)
F
H
y
=
(
F
d
i
a
g
(
x
^
∗
⊙
x
^
)
F
H
+
λ
F
I
F
H
)
−
1
F
d
i
a
g
(
x
^
∗
)
F
H
y
=
(
F
d
i
a
g
(
(
x
^
∗
⊙
x
^
+
λ
)
F
H
)
−
1
F
d
i
a
g
(
x
^
∗
)
F
H
y
=
F
d
i
a
g
(
1
x
^
∗
⊙
x
^
+
λ
)
F
H
F
d
i
a
g
(
x
^
∗
)
F
H
y
=
F
d
i
a
g
(
1
x
^
∗
⊙
x
^
+
λ
)
d
i
a
g
(
x
^
∗
)
F
H
y
=
F
d
i
a
g
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
F
H
y
\begin{aligned}W&=(X^TX+\lambda I)^{-1}X^Ty\\&=((Fdiag(\hat x)F^H)^TFdiag(\hat x)F^H+\lambda FIF^H)^{-1}(Fdiag(\hat x)F^H)^Ty\\&=(Fdiag(\hat x^*)F^HFdiag(\hat x)F^H+\lambda FIF^H)^{-1}Fdiag(\hat x^*)F^Hy\\&=(Fdiag(\hat x^*)diag(\hat x)F^H+\lambda FIF^H)^{-1}Fdiag(\hat x^*)F^Hy\\&=(Fdiag(\hat x^*\odot \hat x)F^H+\lambda FIF^H)^{-1}Fdiag(\hat x^*)F^Hy\\&=(Fdiag((\hat x^*\odot \hat x+\lambda )F^H)^{-1}Fdiag(\hat x^*)F^Hy\\&=Fdiag(\frac{1}{\hat x^*\odot \hat x+\lambda})F^HFdiag(\hat x^*)F^Hy\\&=Fdiag(\frac{1}{\hat x^*\odot \hat x+\lambda})diag(\hat x^*)F^Hy\\&=Fdiag(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda})F^Hy\\\end{aligned}
W=(XTX+λI)−1XTy=((Fdiag(x^)FH)TFdiag(x^)FH+λFIFH)−1(Fdiag(x^)FH)Ty=(Fdiag(x^∗)FHFdiag(x^)FH+λFIFH)−1Fdiag(x^∗)FHy=(Fdiag(x^∗)diag(x^)FH+λFIFH)−1Fdiag(x^∗)FHy=(Fdiag(x^∗⊙x^)FH+λFIFH)−1Fdiag(x^∗)FHy=(Fdiag((x^∗⊙x^+λ)FH)−1Fdiag(x^∗)FHy=Fdiag(x^∗⊙x^+λ1)FHFdiag(x^∗)FHy=Fdiag(x^∗⊙x^+λ1)diag(x^∗)FHy=Fdiag(x^∗⊙x^+λx^∗)FHy
我们回头再来看一下性质1,
C
(
x
)
=
F
d
i
a
g
(
x
^
)
F
H
C(x)=Fdiag(\hat x)F^H
C(x)=Fdiag(x^)FH,加入我们用
y
y
y 来表示
x
^
\hat x
x^(注意这里的
y
y
y 和之前的不是一个意思,只是形式上这么用一下),那么
x
x
x 就可以表示成
F
−
1
(
y
)
\mathcal{F}^{-1}(y)
F−1(y) (注意,这里的
F
\mathcal{F}
F 是花体,表示傅里叶变换,加个-1的上标,表示傅里叶逆变换,不要和之前的
F
F
F 搞混,是两种意思)。把
x
x
x 都换成响应的
y
y
y 来表示:
C
(
x
)
=
F
d
i
a
g
(
x
^
)
F
H
⇒
C
(
F
−
1
(
y
)
)
=
F
d
i
a
g
(
y
)
F
H
C(x)=Fdiag(\hat x)F^H\Rightarrow C(\mathcal{F}^{-1}(y))=\it Fdiag(y)F^H
C(x)=Fdiag(x^)FH⇒C(F−1(y))=Fdiag(y)FH
再进行一次变量替换,令
x
^
∗
x
^
∗
⊙
x
^
+
λ
=
y
\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda}=y
x^∗⊙x^+λx^∗=y ,则:
C
(
F
−
1
(
y
)
)
=
F
d
i
a
g
(
y
)
F
H
C({\mathcal{F}}^{-1}(y))=\it Fdiag(y)F^H\\
C(F−1(y))=Fdiag(y)FH
C
(
F
−
1
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
)
=
F
d
i
a
g
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
F
H
C(\mathcal{F}^{-1}(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda}))=\it Fdiag(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda})F^H
C(F−1(x^∗⊙x^+λx^∗))=Fdiag(x^∗⊙x^+λx^∗)FH
W
=
F
d
i
a
g
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
F
H
y
⇒
W
=
C
(
F
−
1
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
)
y
W=Fdiag(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda})F^Hy \Rightarrow W=C(\mathcal{F}^{-1}(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda}))y\\
W=Fdiag(x^∗⊙x^+λx^∗)FHy⇒W=C(F−1(x^∗⊙x^+λx^∗))y
性质2: F ( C ( x ) y ) = x ^ ∗ ⊙ y ^ = F ∗ ( x ) ⊙ F ( y ) \mathcal{F}(C(x)y)=\hat x^*\odot \hat y=F^*(x)\odot F(y) F(C(x)y)=x^∗⊙y^=F∗(x)⊙F(y)
根据这个性质,我们又可以对上面
W
W
W的表达式进一步简化:
W
=
C
(
F
−
1
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
)
y
⇓
F
(
W
)
=
F
∗
(
F
−
1
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
)
⊙
F
(
y
)
=
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
∗
⊙
F
(
y
)
W=C(\mathcal{F}^{-1}(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda}))y\\ \Downarrow\\ \begin{aligned} F(W)&=F^*(\mathcal{F}^{-1}(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda}))\odot F(y) =(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda})^*\odot F(y) \end{aligned}\\
W=C(F−1(x^∗⊙x^+λx^∗))y⇓F(W)=F∗(F−1(x^∗⊙x^+λx^∗))⊙F(y)=(x^∗⊙x^+λx^∗)∗⊙F(y)
因为
x
^
∗
\hat x^*
x^∗ ,
x
^
\hat x
x^是共轭关系,
x
^
∗
⊙
x
^
\hat x^*\odot \hat x
x^∗⊙x^ 每个元素都是实数,其结果取共轭,元素值不会变,再加上
(
x
^
∗
)
∗
=
x
^
(\hat x^*)^*=\hat x
(x^∗)∗=x^,所以上式可继续化简:
F
(
W
)
=
W
^
=
(
x
^
∗
x
^
∗
⊙
x
^
+
λ
)
∗
⊙
F
(
y
)
=
x
^
⊙
y
^
x
^
∗
⊙
x
^
+
λ
⇓
W
^
=
x
^
⊙
y
^
x
^
∗
⊙
x
^
+
λ
F(W)=\hat W=(\frac{\hat x^*}{\hat x^*\odot \hat x+\lambda})^*\odot F(y)=\frac{\hat x\odot \hat y}{\hat x^*\odot \hat x+\lambda}\\ \Downarrow\\ \hat W=\frac{\hat x\odot \hat y}{\hat x^*\odot \hat x+\lambda}
F(W)=W^=(x^∗⊙x^+λx^∗)∗⊙F(y)=x^∗⊙x^+λx^⊙y^⇓W^=x^∗⊙x^+λx^⊙y^
这里,继续用帽子形状的上标表示变量的傅里叶变换。
这个简单的二分类模型,应用范围非常广。除了可以划分羊村、狼村这样简单的模型,还可以用于目标跟踪问题,比如比较出名的KCF算法。
还是利用前面的分类器, y = f ( x ) = W T x y=f(x)=W^Tx y=f(x)=WTx,如果这里的 x x x 表示的是我们输入的图像, y y y 是这幅图像与我们预设目标相匹配的结果,可以是0,1或者也可以是匹配的概率,这个由个人设定; W W W 是我们设定或通过训练得到的权重。
得到 W W W的表示方法后,分类器可以写成 f ( z ) = W T z = ( X T X + λ I ) − 1 X T y z f(z)=W^Tz=(X^TX+\lambda I)^{-1}X^Tyz f(z)=WTz=(XTX+λI)−1XTyz,注意,这里的 X , z X,z X,z 都是经过 ϕ \phi ϕ 映射后的值,这里为了方便,还用原来的形式。而为了与计算 W W W时用到的 x i x_i xi 相区别,这里用 z z z 表示。用羊村的故事来理解,就是 x i x_i xi 表示青青草原上现有的动物,而 z z z 是新来的动物, f ( z ) f(z) f(z) 就是利用草原原来的动物集 X X X和对应的分类标签 y y y 来计算新来的动物 z z z 应该所属的分类。
第二部分 线性不可分
刚才,我们所做的是用一条笔直的栏杆,将羊村和狼村分开。但是有很多情况下,我们无法找到这样一条直线进行分割,比如下面这种情况。
此时,可以借助SVM的思想,将这个二维平面上的问题,投射到高维上,在从高维空间上,找到一个与那条直栅栏类似的超平面来完成分割,如下所示。
关于SVM,推荐阅读《支持向量机通俗导论(理解SVM的三层境界)》
此时输入
x
i
x_i
xi和输出
y
i
y_i
yi 不在具有线性关系。但是可以找到一个映射:
ϕ
\phi
ϕ 使得
ϕ
(
x
i
)
\phi(x_i)
ϕ(xi) 与
y
i
y_i
yi 继续保持线性关系,用函数表示就是:
y
i
=
f
(
ϕ
(
x
i
)
)
=
W
T
ϕ
(
x
i
)
y_i=f(\phi(x_i))=W^T\phi(x_i)
yi=f(ϕ(xi))=WTϕ(xi)
需要注意的是,此时的
W
W
W 与之前线性可分条件下的维度是不一样的。因为映射 $\phi $ 将数据从低纬度映射到高纬度,在低纬度下的数据特征假设为
d
d
d 维,那么高纬度下的维度,则是与 $\phi $ 相关的一个数,假设为
m
m
m ,是一个由向量
ϕ
(
x
1
)
,
ϕ
(
x
2
)
,
…
,
ϕ
(
x
n
)
\phi(x_1),\phi(x_2),\ldots,\phi(x_n)
ϕ(x1),ϕ(x2),…,ϕ(xn) 张成的向量空间中的向量。在高纬度下,可以这样表示
W
W
W,即
W
=
∑
i
=
1
n
a
i
ϕ
(
x
i
)
=
[
ϕ
(
x
1
)
,
…
,
ϕ
(
x
n
)
]
m
×
n
[
a
1
⋯
a
n
]
n
×
1
=
ϕ
T
(
X
)
a
W=\sum_{i=1}^na_i\phi(x_i)=[\phi(x_1),\ldots,\phi(x_n)]_{m\times n}\begin{bmatrix}a_1\\\cdots\\a_n\end{bmatrix}_{n\times 1}=\phi^T(X)a
W=i=1∑naiϕ(xi)=[ϕ(x1),…,ϕ(xn)]m×n⎣⎡a1⋯an⎦⎤n×1=ϕT(X)a
其中
ϕ
(
X
)
=
[
ϕ
T
(
x
1
)
⋯
ϕ
T
(
x
n
)
]
n
×
m
ϕ
T
(
X
)
=
ϕ
(
X
T
)
=
[
ϕ
(
x
1
)
,
⋯
,
ϕ
(
x
n
)
]
m
×
n
a
=
[
a
1
,
…
,
a
n
]
T
\phi(X)=\begin{bmatrix}\phi^T(x_{1})\\ \cdots\\\phi^T(x_{n})\end{bmatrix}_{n\times m}\\\phi^T(X)=\phi(X^T)=\begin{bmatrix}\phi (x_{1}), \cdots,\phi (x_{n})\end{bmatrix}_{m\times n}\\a=[a_1,\ldots,a_n]^T
ϕ(X)=⎣⎡ϕT(x1)⋯ϕT(xn)⎦⎤n×mϕT(X)=ϕ(XT)=[ϕ(x1),⋯,ϕ(xn)]m×na=[a1,…,an]T
表达式中
a
i
a_i
ai 是未知量,为了求它的表达,与线性可分时相似,还是建立损失函数并求导计算。
L
o
s
s
=
∑
i
=
1
n
∣
∣
W
T
ϕ
(
x
i
)
−
y
i
∣
∣
2
+
λ
∣
∣
W
∣
∣
2
=
∣
∣
ϕ
(
X
)
W
−
y
∣
∣
2
+
λ
∣
∣
W
∣
∣
2
=
∣
∣
ϕ
(
X
)
ϕ
T
(
X
)
a
−
y
∣
∣
2
+
λ
∣
∣
ϕ
T
(
X
)
a
∣
∣
2
=
(
ϕ
(
X
)
ϕ
T
(
X
)
a
−
y
)
T
(
ϕ
(
X
)
ϕ
T
(
X
)
a
−
y
)
+
λ
(
ϕ
T
(
X
)
a
)
T
ϕ
T
(
X
)
a
=
(
ϕ
(
X
)
ϕ
T
(
X
)
a
−
y
)
T
(
ϕ
(
X
)
ϕ
T
(
X
)
a
−
y
)
+
λ
(
ϕ
T
(
X
)
a
)
T
ϕ
T
(
X
)
a
\begin{aligned} Loss&=\sum_{i=1}^n||W^T\phi(x_i)-y_i||^2+\lambda||W||^2\\ &=||\phi(X)W-y||^2+\lambda||W||^2\\ &=||\phi(X)\phi^T(X)a-y||^2+\lambda||\phi^T(X)a||^2\\ &=(\phi(X)\phi^T(X)a-y)^T(\phi(X)\phi^T(X)a-y)+\lambda(\phi^T(X)a)^T\phi^T(X)a\\ &=(\phi(X)\phi^T(X)a-y)^T(\phi(X)\phi^T(X)a-y)+\lambda(\phi^T(X)a)^T\phi^T(X)a\\ \end{aligned}
Loss=i=1∑n∣∣WTϕ(xi)−yi∣∣2+λ∣∣W∣∣2=∣∣ϕ(X)W−y∣∣2+λ∣∣W∣∣2=∣∣ϕ(X)ϕT(X)a−y∣∣2+λ∣∣ϕT(X)a∣∣2=(ϕ(X)ϕT(X)a−y)T(ϕ(X)ϕT(X)a−y)+λ(ϕT(X)a)TϕT(X)a=(ϕ(X)ϕT(X)a−y)T(ϕ(X)ϕT(X)a−y)+λ(ϕT(X)a)TϕT(X)a
将
ϕ
(
X
)
\phi(X)
ϕ(X) 简写成$\phi $ ,
ϕ
T
(
X
)
\phi^T(X)
ϕT(X) 简写成
ϕ
T
\phi^T
ϕT,上式整理成:
L
o
s
s
=
(
ϕ
(
X
)
ϕ
T
(
X
)
a
−
y
)
T
(
ϕ
(
X
)
ϕ
T
(
X
)
a
−
y
)
+
λ
(
ϕ
T
(
X
)
a
)
T
ϕ
T
(
X
)
a
=
(
a
T
ϕ
ϕ
T
−
y
T
)
(
ϕ
ϕ
T
a
−
y
)
+
λ
a
T
ϕ
ϕ
T
a
=
a
T
ϕ
ϕ
T
ϕ
ϕ
T
a
−
a
T
ϕ
ϕ
T
y
−
y
T
ϕ
ϕ
T
a
+
y
T
y
+
λ
a
T
ϕ
ϕ
T
a
\begin{aligned} Loss&=(\phi(X)\phi^T(X)a-y)^T(\phi(X)\phi^T(X)a-y)+\lambda(\phi^T(X)a)^T\phi^T(X)a\\ &=(a^T\phi\phi^T-y^T)(\phi\phi^Ta-y)+\lambda a^T\phi\phi^T a\\ &=a^T\phi\phi^T\phi\phi^Ta-a^T\phi\phi^T y-y^T\phi\phi^Ta+y^Ty+\lambda a^T\phi\phi^Ta\\ \end{aligned}
Loss=(ϕ(X)ϕT(X)a−y)T(ϕ(X)ϕT(X)a−y)+λ(ϕT(X)a)TϕT(X)a=(aTϕϕT−yT)(ϕϕTa−y)+λaTϕϕTa=aTϕϕTϕϕTa−aTϕϕTy−yTϕϕTa+yTy+λaTϕϕTa
注意到,多项式里的每一项都是标量,因此有转置等于本身,进一步整理:
L
o
s
s
=
a
T
ϕ
ϕ
T
ϕ
ϕ
T
a
−
a
T
ϕ
ϕ
T
y
−
y
T
ϕ
ϕ
T
a
+
y
T
y
+
λ
a
T
ϕ
ϕ
T
a
=
a
T
ϕ
ϕ
T
ϕ
ϕ
T
a
−
2
y
T
ϕ
ϕ
T
a
+
y
T
y
+
λ
a
T
ϕ
ϕ
T
a
\begin{aligned} Loss&=a^T\phi\phi^T\phi\phi^Ta-a^T\phi\phi^T y-y^T\phi\phi^Ta+y^Ty+\lambda a^T\phi\phi^Ta\\ &=a^T\phi\phi^T\phi\phi^Ta-2y^T\phi\phi^Ta+y^Ty+\lambda a^T\phi\phi^Ta\\ \end{aligned}
Loss=aTϕϕTϕϕTa−aTϕϕTy−yTϕϕTa+yTy+λaTϕϕTa=aTϕϕTϕϕTa−2yTϕϕTa+yTy+λaTϕϕTa
利用矩阵求导公式:
∂
x
T
A
x
∂
x
=
A
T
x
+
A
x
\frac{\partial x^TAx}{\partial x}=A^Tx+Ax
∂x∂xTAx=ATx+Ax,
∂
a
T
x
∂
x
=
a
\frac{\partial a^Tx}{\partial x}=a
∂x∂aTx=a ,再进一步整理:
∂
L
o
s
s
∂
a
=
∂
(
a
T
ϕ
ϕ
T
ϕ
ϕ
T
a
−
2
y
T
ϕ
ϕ
T
a
+
y
T
y
+
λ
a
T
ϕ
ϕ
T
a
)
∂
a
=
∂
(
a
T
ϕ
ϕ
T
ϕ
ϕ
T
a
)
∂
a
−
∂
(
2
y
T
ϕ
ϕ
T
a
)
∂
a
+
∂
(
y
T
y
)
∂
a
+
∂
(
λ
a
T
ϕ
ϕ
T
a
)
∂
a
=
2
ϕ
ϕ
T
ϕ
ϕ
T
a
−
2
ϕ
ϕ
T
y
+
2
λ
ϕ
ϕ
T
a
\begin{aligned} \frac{\partial Loss}{\partial a}&=\frac{\partial (a^T\phi\phi^T\phi\phi^Ta-2y^T\phi\phi^Ta+y^Ty+\lambda a^T\phi\phi^Ta)}{\partial a}\\ &=\frac{\partial (a^T\phi\phi^T\phi\phi^Ta)}{\partial a}-\frac{\partial (2y^T\phi\phi^Ta)}{\partial a}+\frac{\partial (y^Ty)}{\partial a}+\frac{\partial (\lambda a^T\phi\phi^Ta)}{\partial a}\\ &=2\phi\phi^T\phi\phi^Ta-2\phi\phi^Ty+2\lambda \phi\phi^Ta \end{aligned}
∂a∂Loss=∂a∂(aTϕϕTϕϕTa−2yTϕϕTa+yTy+λaTϕϕTa)=∂a∂(aTϕϕTϕϕTa)−∂a∂(2yTϕϕTa)+∂a∂(yTy)+∂a∂(λaTϕϕTa)=2ϕϕTϕϕTa−2ϕϕTy+2λϕϕTa
令损失函数导数为0:
∂
L
o
s
s
∂
a
=
2
ϕ
ϕ
T
ϕ
ϕ
T
a
−
2
ϕ
ϕ
T
y
+
2
λ
ϕ
ϕ
T
a
=
0
⇓
ϕ
ϕ
T
(
ϕ
ϕ
T
+
λ
I
)
a
=
ϕ
ϕ
T
y
⇓
a
=
(
ϕ
ϕ
T
+
λ
I
)
−
1
y
\frac{\partial Loss}{\partial a}=2\phi\phi^T\phi\phi^Ta-2\phi\phi^Ty+2\lambda \phi\phi^Ta=0\\\Downarrow\\\phi\phi^T(\phi\phi^T+\lambda I)a=\phi\phi^Ty\\\Downarrow\\a=(\phi\phi^T+\lambda I)^{-1}y
∂a∂Loss=2ϕϕTϕϕTa−2ϕϕTy+2λϕϕTa=0⇓ϕϕT(ϕϕT+λI)a=ϕϕTy⇓a=(ϕϕT+λI)−1y
注:这里利用了
ϕ
ϕ
T
\phi\phi^T
ϕϕT 可逆。
在把
a
a
a 带入到分类器中,可以得到:
f
(
ϕ
(
z
)
)
=
W
T
ϕ
(
z
)
=
(
ϕ
T
(
X
)
a
)
T
ϕ
(
z
)
=
a
T
ϕ
(
X
)
ϕ
(
z
)
=
(
(
ϕ
(
X
)
ϕ
T
(
X
)
+
λ
I
)
−
1
y
)
T
ϕ
(
X
)
ϕ
(
z
)
\begin{aligned}f(\phi(z))&=W^T\phi(z)\\&=(\phi^T(X)a)^T\phi(z)\\&=a^T\phi(X)\phi(z)\\&=((\phi(X)\phi^T(X)+\lambda I)^{-1}y)^T\phi(X)\phi(z)\\\end{aligned}
f(ϕ(z))=WTϕ(z)=(ϕT(X)a)Tϕ(z)=aTϕ(X)ϕ(z)=((ϕ(X)ϕT(X)+λI)−1y)Tϕ(X)ϕ(z)
公式里出现了,
ϕ
(
X
)
ϕ
T
(
X
)
\phi(X)\phi^T(X)
ϕ(X)ϕT(X),
ϕ
(
X
)
ϕ
(
z
)
\phi(X)\phi(z)
ϕ(X)ϕ(z),
假设
K
=
ϕ
(
X
)
ϕ
T
(
X
)
K=\phi(X)\phi^T(X)
K=ϕ(X)ϕT(X) ,这是个核空间的核矩阵。
K
=
ϕ
(
X
)
ϕ
T
(
X
)
=
[
ϕ
T
(
x
1
)
⋯
ϕ
T
(
x
n
)
]
[
ϕ
(
x
1
)
⋯
ϕ
(
x
n
)
]
=
[
ϕ
T
(
x
1
)
ϕ
(
x
1
)
⋯
ϕ
T
(
x
1
)
ϕ
(
x
n
)
⋯
ϕ
T
(
x
n
)
ϕ
(
x
1
)
⋯
ϕ
T
(
x
n
)
ϕ
(
x
n
)
]
\begin{aligned}K&=\phi(X)\phi^T(X)\\&=\left[\begin{array}{ccc}\\\phi^T(x_{1})\\ \cdots\\\phi^T(x_{n})\end{array}\right]\left[\begin{array}{c}\\\phi(x_{1})& \cdots&\phi (x_{n})\end{array}\right]\\&=\left[\begin{array}{ccc}\\\phi^T(x_{1})\phi(x_{1})&\cdots&\phi^T(x_{1})\phi(x_{n})\\\cdots\\\phi^T(x_{n})\phi(x_{1})&\cdots&\phi^T(x_{n})\phi(x_{n})\\\end{array}\right]\\\end{aligned}
K=ϕ(X)ϕT(X)=⎣⎢⎢⎡ϕT(x1)⋯ϕT(xn)⎦⎥⎥⎤[ϕ(x1)⋯ϕ(xn)]=⎣⎢⎢⎡ϕT(x1)ϕ(x1)⋯ϕT(xn)ϕ(x1)⋯⋯ϕT(x1)ϕ(xn)ϕT(xn)ϕ(xn)⎦⎥⎥⎤
前面我们已经知道,循环矩阵有很多非常好的性质可以简便运算过程。在这里,同样为了简化运算,假设存在一个映射
ϕ
\phi
ϕ,使得
K
K
K 是一个循环矩阵。那么,它可以用首行来表示,假设首行为
k
x
x
k^{xx}
kxx,则
K
=
C
(
k
x
x
)
K=C(k^{xx})
K=C(kxx) 。
之前的
a
a
a 则又可以写成:
a
=
(
ϕ
ϕ
T
+
λ
I
)
−
1
y
=
F
d
i
a
g
(
k
^
x
x
+
λ
)
−
1
F
H
y
⇓
a
=
C
(
F
−
1
(
1
k
^
x
x
+
λ
)
)
y
⇓
a
^
=
F
(
F
−
1
(
1
k
^
x
x
+
λ
)
)
∗
⊙
y
^
⇓
a
^
=
y
^
(
k
^
x
x
+
λ
)
∗
⇓
a
^
=
y
^
k
^
x
x
+
λ
a=(\phi\phi^T+\lambda I)^{-1}y=Fdiag(\hat k^{xx}+\lambda )^{-1}F^Hy\\\Downarrow\\a=C(\mathcal{F}^{-1}(\frac{1}{\hat k^{xx}+\lambda}))y\\\Downarrow\\\hat a=\mathcal{F}(\mathcal{F}^{-1}(\frac{1}{\hat k^{xx}+\lambda}))^*\odot \hat y\\\Downarrow\\\hat a=\frac{\hat y}{(\hat k^{xx}+\lambda)^*}\\\Downarrow\\\hat a=\frac{\hat y}{\hat k^{xx}+\lambda}
a=(ϕϕT+λI)−1y=Fdiag(k^xx+λ)−1FHy⇓a=C(F−1(k^xx+λ1))y⇓a^=F(F−1(k^xx+λ1))∗⊙y^⇓a^=(k^xx+λ)∗y^⇓a^=k^xx+λy^
最后一步,用到了对称向量的傅里叶变换为实数,这里的
k
^
x
x
\hat k^{xx}
k^xx是一个对称向量。参考:【目标跟踪】KCF高速跟踪详解。
f
=
a
T
ϕ
(
X
)
ϕ
(
z
)
\begin{aligned}f&=a^T\phi(X)\phi(z)\\\end{aligned}
f=aTϕ(X)ϕ(z)
当要测试的图也有和
X
X
X 中同样数目的时候,假设为
n
n
n,设 :
ϕ T ( Z ) = [ ϕ ( z 1 ) , ⋯ , ϕ ( z n ) ] \phi^T(Z)=[\phi(z_1),\cdots,\phi(z_n)] ϕT(Z)=[ϕ(z1),⋯,ϕ(zn)]
f
T
(
Z
)
=
[
f
(
ϕ
(
z
1
)
)
,
⋯
,
f
(
ϕ
(
z
n
)
)
]
f^T(Z)=[f(\phi(z_1)),\cdots,f(\phi(z_n))]
fT(Z)=[f(ϕ(z1)),⋯,f(ϕ(zn))]
f
T
(
Z
)
=
a
T
ϕ
(
X
)
ϕ
T
(
Z
)
f^T(Z)=a^T\phi(X)\phi^T(Z)
fT(Z)=aTϕ(X)ϕT(Z)
可以看到,这里
ϕ
(
X
)
ϕ
T
(
Z
)
\phi(X)\phi^T(Z)
ϕ(X)ϕT(Z) 与
K
=
ϕ
(
X
)
ϕ
T
(
X
)
K=\phi(X)\phi^T(X)
K=ϕ(X)ϕT(X) 形式上一样的,因此,也可以认为是一个循环矩阵。设这个新的矩阵为
K
Z
=
ϕ
(
X
)
ϕ
T
(
Z
)
K^Z=\phi(X)\phi^T(Z)
KZ=ϕ(X)ϕT(Z)。
f
T
(
Z
)
=
a
T
K
Z
f^T(Z)=a^TK^Z
fT(Z)=aTKZ,所以
f
(
Z
)
=
(
K
Z
)
T
a
f(Z)=(K^Z)^Ta
f(Z)=(KZ)Ta。
参考:KCF(核化相關濾波)跟蹤公式推導筆記(2)——非線性濾波器的解、快速檢測及快速核相關
我们来推导 f ( Z ) f(Z) f(Z) 的表达式。
假设 k x z k^{xz} kxz 是矩阵 K Z K^Z KZ 的首行,由于它是个循环矩阵,可以写成 K Z = C ( k x z ) = F d i a g ( k ^ x z ) F H K^Z=C(k^{xz})=Fdiag(\hat k^{xz})F^H KZ=C(kxz)=Fdiag(k^xz)FH。 ( K Z ) T = F d i a g ( ( k ^ x z ) ∗ ) F H = C ( ( k x z ) ∗ ) (K^Z)^T=Fdiag((\hat k^{xz})^*)F^H=C(( k^{xz})^*) (KZ)T=Fdiag((k^xz)∗)FH=C((kxz)∗)。
令
β
=
(
k
x
z
)
∗
\beta=(k^{xz})^*
β=(kxz)∗ (这个替代,纯粹是为了方便书写)。
f
(
Z
)
=
C
(
β
)
a
f(Z)=C(\beta)a
f(Z)=C(β)a
f
(
Z
)
=
C
(
β
)
a
⇓
f
^
(
Z
)
=
F
(
C
(
β
)
a
)
=
β
^
∗
⊙
a
^
=
k
^
x
z
⊙
a
^
f(Z)=C(\beta)a\\\Downarrow\\\hat f(Z)={\mathcal{F}}(C(\beta)a)=\hat \beta^*\odot \hat a=\hat k^{xz}\odot \hat a\\
f(Z)=C(β)a⇓f^(Z)=F(C(β)a)=β^∗⊙a^=k^xz⊙a^
又因为前面已经得到了
a
^
\hat a
a^ 的表达式,将其带入,得到:
f
^
(
Z
)
=
k
^
x
z
⊙
y
^
k
^
x
x
+
λ
\hat f(Z)=\hat k^{xz}\odot \frac{\hat y}{\hat k^{xx}+\lambda}
f^(Z)=k^xz⊙k^xx+λy^
到此,函数计算中的难点集中在了
k
^
x
x
\hat k^{xx}
k^xx 和
k
^
x
z
\hat k^{xz}
k^xz 之中。
K
=
ϕ
(
X
)
ϕ
T
(
X
)
=
[
ϕ
T
(
x
1
)
⋯
ϕ
T
(
x
n
)
]
[
ϕ
(
x
1
)
⋯
ϕ
(
x
n
)
]
=
[
ϕ
T
(
x
1
)
ϕ
(
x
1
)
⋯
ϕ
T
(
x
1
)
ϕ
(
x
n
)
⋯
ϕ
T
(
x
n
)
ϕ
(
x
1
)
⋯
ϕ
T
(
x
n
)
ϕ
(
x
n
)
]
\begin{aligned}K&=\phi(X)\phi^T(X)=\left[\begin{array}{ccc}\\\phi^T(x_{1})\\ \cdots\\\phi^T(x_{n})\end{array}\right]\left[\begin{array}{ccc}\\\phi(x_{1})& \cdots&\phi (x_{n})\end{array}\right]\\&=\left[\begin{array}{ccc}\\\phi^T(x_{1})\phi(x_{1})&\cdots&\phi^T(x_{1})\phi(x_{n})\\\cdots\\\phi^T(x_{n})\phi(x_{1})&\cdots&\phi^T(x_{n})\phi(x_{n})\\\end{array}\right]\\\end{aligned}
K=ϕ(X)ϕT(X)=⎣⎢⎢⎡ϕT(x1)⋯ϕT(xn)⎦⎥⎥⎤[ϕ(x1)⋯ϕ(xn)]=⎣⎢⎢⎡ϕT(x1)ϕ(x1)⋯ϕT(xn)ϕ(x1)⋯⋯ϕT(x1)ϕ(xn)ϕT(xn)ϕ(xn)⎦⎥⎥⎤
K
K
K 的第一行,即
k
x
x
k^{xx}
kxx 为
[
ϕ
T
(
x
1
)
ϕ
(
x
1
)
,
⋯
,
ϕ
T
(
x
1
)
ϕ
(
x
n
)
]
[\phi^T(x_{1})\phi(x_{1}),\cdots,\phi^T(x_{1})\phi(x_{n})]
[ϕT(x1)ϕ(x1),⋯,ϕT(x1)ϕ(xn)]
对这个求傅里叶变换,也是非常有难度的。因此需要进一步化简。
这里,要用到核函数的一种性质,即 ϕ T ( μ ) ϕ ( υ ) = k ( μ , υ ) = g ( μ T υ ) \phi^T(\mu)\phi(\upsilon)=k(\mu,\upsilon)=g(\mu^T\upsilon) ϕT(μ)ϕ(υ)=k(μ,υ)=g(μTυ)
在KCF算法里(终于提到了KCF),输入的
x
i
x_i
xi 都是经过不断地循环获得的,生成的是循环矩阵。它们之间的关系,所有的输入都可以通过初始向量(假设是
x
1
x_1
x1 )经过左乘、右乘矩阵得到。即
x
i
=
P
i
−
1
x
1
x_i=P^{i-1}x_1
xi=Pi−1x1。
k
x
x
=
[
ϕ
T
(
x
1
)
ϕ
(
x
1
)
,
⋯
,
ϕ
T
(
x
1
)
ϕ
(
x
n
)
]
=
[
g
(
x
1
T
x
1
)
,
g
(
x
1
T
x
2
)
,
⋯
,
g
(
x
1
T
x
n
−
1
)
,
g
(
x
1
T
x
n
)
]
=
[
g
(
x
1
T
P
0
x
1
)
,
g
(
x
1
T
P
1
x
1
)
,
⋯
,
g
(
x
1
T
P
n
−
2
x
1
)
,
g
(
x
1
T
P
n
−
1
x
1
)
]
=
g
[
x
1
T
P
0
x
1
,
x
1
T
P
1
x
1
,
⋯
,
x
1
T
P
n
−
2
x
1
,
x
1
T
P
n
−
1
x
1
]
\begin{aligned}k^{xx}&=[\phi^T(x_{1})\phi(x_{1}),\cdots,\phi^T(x_{1})\phi(x_{n})]\\&=[g(x_1^Tx_1),g(x_1^Tx_2),\cdots,g(x_1^Tx_{n-1}),g(x_1^Tx_n)]\\&=[g(x_1^TP^{0}x_1),g(x_1^TP^{1}x_1),\cdots,g(x_1^TP^{n-2}x_{1}),g(x_1^TP^{n-1}x_1)]\\&=g[x_1^TP^{0}x_1,x_1^TP^{1}x_1,\cdots,x_1^TP^{n-2}x_{1},x_1^TP^{n-1}x_1]\end{aligned}
kxx=[ϕT(x1)ϕ(x1),⋯,ϕT(x1)ϕ(xn)]=[g(x1Tx1),g(x1Tx2),⋯,g(x1Txn−1),g(x1Txn)]=[g(x1TP0x1),g(x1TP1x1),⋯,g(x1TPn−2x1),g(x1TPn−1x1)]=g[x1TP0x1,x1TP1x1,⋯,x1TPn−2x1,x1TPn−1x1]
C
(
x
1
)
x
1
=
[
x
1
T
x
2
T
⋯
x
n
T
]
x
1
=
[
x
11
x
12
⋯
x
1
m
x
21
x
22
⋯
x
2
m
⋯
x
n
1
x
n
2
⋯
x
n
m
]
[
x
11
x
12
⋯
x
1
m
]
=
[
x
1
T
x
1
x
2
T
x
1
⋯
x
n
T
x
1
]
⇓
g
(
C
(
x
1
)
x
1
)
=
g
[
x
1
T
x
1
x
2
T
x
1
⋯
x
n
T
x
1
]
=
[
g
(
x
1
T
x
1
)
g
(
x
2
T
x
1
)
⋯
g
(
x
n
T
x
1
)
]
=
[
g
(
x
1
T
x
1
)
g
(
x
1
T
x
2
)
⋯
g
(
x
1
T
x
n
)
]
=
[
g
(
x
1
T
P
0
x
1
)
g
(
x
1
T
P
1
x
1
)
⋯
g
(
x
1
T
P
n
−
1
x
1
)
]
C(x_1)x_1=\left[\begin{array}{ccc}\\x_{1}^T\\x_2^T\\\cdots\\x_n^T\end{array}\right]x_1=\left[\begin{array}{ccc}\\x_{11}&x_{12}&\cdots&x_{1m}\\x_{21}&x_{22}&\cdots&x_{2m}\\\cdots\\x_{n1}&x_{n2}&\cdots&x_{nm}\end{array}\right]\left[\begin{array}{ccc}\\x_{11}\\x_{12}\\\cdots\\x_{1m}\end{array}\right]=\left[\begin{array}{ccc}\\x_{1}^Tx_{1}\\x_{2}^Tx_{1}\\\cdots\\x_{n}^Tx_{1}\end{array}\right]\\\Downarrow\\g(C(x_1)x_1)=g\left[\begin{array}{ccc}\\x_{1}^Tx_{1}\\x_{2}^Tx_{1}\\\cdots\\x_{n}^Tx_{1}\end{array}\right]=\left[\begin{array}{ccc}\\g(x_{1}^Tx_{1})\\g(x_{2}^Tx_{1})\\\cdots\\g(x_{n}^Tx_{1})\end{array}\right]=\left[\begin{array}{ccc}\\g(x_{1}^Tx_{1})\\g(x_{1}^Tx_{2})\\\cdots\\g(x_{1}^Tx_{n})\end{array}\right]=\left[\begin{array}{ccc}\\g(x_{1}^TP^{0}x_{1})\\g(x_{1}^TP^{1}x_{1})\\\cdots\\g(x_{1}^TP^{n-1}x_{1})\end{array}\right]\\
C(x1)x1=⎣⎢⎢⎡x1Tx2T⋯xnT⎦⎥⎥⎤x1=⎣⎢⎢⎡x11x21⋯xn1x12x22xn2⋯⋯⋯x1mx2mxnm⎦⎥⎥⎤⎣⎢⎢⎡x11x12⋯x1m⎦⎥⎥⎤=⎣⎢⎢⎡x1Tx1x2Tx1⋯xnTx1⎦⎥⎥⎤⇓g(C(x1)x1)=g⎣⎢⎢⎡x1Tx1x2Tx1⋯xnTx1⎦⎥⎥⎤=⎣⎢⎢⎡g(x1Tx1)g(x2Tx1)⋯g(xnTx1)⎦⎥⎥⎤=⎣⎢⎢⎡g(x1Tx1)g(x1Tx2)⋯g(x1Txn)⎦⎥⎥⎤=⎣⎢⎢⎡g(x1TP0x1)g(x1TP1x1)⋯g(x1TPn−1x1)⎦⎥⎥⎤
所以
(
k
x
x
)
T
=
g
(
C
(
x
1
)
x
1
)
⇓
F
(
(
C
(
x
1
)
x
1
)
)
=
x
^
1
∗
⊙
x
^
1
⇒
C
(
x
1
)
x
1
=
F
−
1
(
x
^
1
∗
⊙
x
^
1
)
⇓
(
k
x
x
)
T
=
g
(
F
−
1
(
x
^
1
∗
⊙
x
^
1
)
)
(k^{xx})^T=g(C(x_1)x_1)\\\Downarrow\\{\mathcal{F}}((C(x_1)x_1))=\hat x_1^*\odot \hat x_1 \Rightarrow C(x_1)x_1={\mathcal{F}}^{-1}(\hat x_1^*\odot \hat x_1)\\\Downarrow\\ (k^{xx})^T=g({\mathcal{F}}^{-1}(\hat x_1^*\odot \hat x_1))
(kxx)T=g(C(x1)x1)⇓F((C(x1)x1))=x^1∗⊙x^1⇒C(x1)x1=F−1(x^1∗⊙x^1)⇓(kxx)T=g(F−1(x^1∗⊙x^1))
如果开始的时候,就把
k
x
x
k^{xx}
kxx 定义成列向量,那么结果就是:
k
x
x
=
g
(
F
−
1
(
x
^
1
∗
⊙
x
^
1
)
)
k^{xx} =g({\mathcal{F}}^{-1}(\hat x_1^*\odot \hat x_1))
kxx=g(F−1(x^1∗⊙x^1))。不管怎么样定义,前后一致就好。另外一组变量
k
x
z
k^{xz}
kxz 遵从同样的方法可以求得:
k
x
z
=
g
(
F
−
1
(
x
^
1
∗
⊙
z
^
)
)
k^{xz} =g({\mathcal{F}}^{-1}(\hat x_1^*\odot \hat z))
kxz=g(F−1(x^1∗⊙z^))
到这里,关于分类器的表达式已经化简到了最优:
f
^
(
Z
)
=
k
^
x
z
⊙
y
^
k
^
x
x
+
λ
k
x
x
=
g
(
F
−
1
(
x
^
1
∗
⊙
x
^
1
)
)
\hat f(Z)=\hat k^{xz}\odot \frac{\hat y}{\hat k^{xx}+\lambda}\\k^{xx} =g({\mathcal{F}}^{-1}(\hat x_1^*\odot \hat x_1))
f^(Z)=k^xz⊙k^xx+λy^kxx=g(F−1(x^1∗⊙x^1))
至此,算法已经全部推导完毕。从推导过程中,我们看出算法的分类思想还是基于SVM的,之后又利用了循环矩阵的性质使得结果运算量大为减少。
在做图像目标跟踪的时候,遇到的情况几乎是线性不可分的,因此我们采用第二部分推导的公式。公式中, x 1 x_1 x1, z z z 分别是我们作为模板的图像,和要进行目标跟踪的图像(推导过程中采用的是1维向量,但是图像是2维的,可以看做将其拉伸后变成1维进行处理)。根据公式,我们只需要提前标定好一张图像,就可以得到所要的结果。
跟踪的过程一般为,先给定一个模板图像 x x x ,在其上进行标注,一般是目标中心点处,灰度值设为1,其与部分设成0,这个标注好的0-1图像就是 y y y,处理的时候可能会用到高斯函数。在用分类器对图像 z z z 进行测试,得到的结果经过傅里叶逆变换后 f ( Z ) f(Z) f(Z) ,也可以看成是一张图像,和标注图像类似,上面最亮的地方就是目标的中心位置。
最后,
g
g
g 函数,一般用的比较多的是高斯核,它最后的形式是:
k
x
z
=
e
x
p
(
−
1
σ
2
(
∣
∣
x
∣
∣
2
+
∣
∣
z
∣
∣
2
−
2
F
−
1
(
x
^
∗
⊙
z
^
)
)
)
k^{xz} =exp(-\frac{1}{\sigma^2}(||x||^2+||z||^2-2{\mathcal{F}}^{-1}(\hat x^*\odot \hat z)))
kxz=exp(−σ21(∣∣x∣∣2+∣∣z∣∣2−2F−1(x^∗⊙z^)))