Kaczmarz迭代算法背景
Kaczmarz迭代算法作用:最初被用来求解线性方程组,在MPI中被用来重建图像。
假设存在一个线性方程组(此方程可以用来建模MPI中系统矩阵和接收信号之间的关系):
S
c
=
u
Sc = u\qquad
Sc=u
其中
S
∈
C
M
×
N
,
c
∈
C
N
,
u
∈
C
M
S \in C^{M\times N},c \in C^N,u \in C^M
S∈CM×N,c∈CN,u∈CM。M为M个频率分量,N对应了MPI中体素的个数。
MPI背景: 在MPI中S即为系统矩阵, c c c为空间中粒子分布的浓度, u u u为接收到的电压信号。而MPI重建的就是粒子浓度的空间分布 c c c,因此可以通过已知的 S , u S,u S,u求解 c c c。
Kaczmarz迭代算法核心公式
和其他文章一样,这里首先给出Kaczmarz算法的核心公式:
c
k
+
1
=
c
k
+
λ
u
i
−
s
i
⋅
c
k
∣
∣
s
i
∣
∣
2
2
s
i
c^{k+1}=c^k +\lambda \frac{u_i-s_i\cdot c^k}{||s_i||_2^2}s_i
ck+1=ck+λ∣∣si∣∣22ui−si⋅cksi
其中,k表示第k次迭代的结果,
i
=
k
m
o
d
M
+
1
i=k \ mod \ M +1
i=k mod M+1,
λ
\lambda
λ 为松弛因子,目的是使算法收敛到加权最小二乘解上,迭代M次后记为一次完整迭代。
简单理解这个公式,就是算法通过正向计算得到一个投影 s i ⋅ c k s_i \cdot c^k si⋅ck,然后将计算的投影与实际测量值 u i u_i ui相比较,然后使用二者的差值优化参数 c c c。迭代进行这一优化过程,直到达到最优解(近似)。其中 c c c初始可为任意值。
Kaczmarz迭代算法公式推导
首先回到方程(1),可以将方程(1)看作M个方程,每个方程有N个变量,这N个变量对应了空间中的N个维度,那么每个方程就可以被视为N维空间中的一个超平面。求解这M个方程就可以被视为求解M个超平面的交平面((N-1)维)。那么Kaczmarz算法是如何实现这一求解过程的呢?
算法通过迭代求解的方法,使得每一次迭代的结果都能满足M个方程中的一个,而每次迭代满足的方程与前一次不同(通过随机选择,或顺序选择的方式实现不同方程的选择),这样结果会随着迭代的进行逐渐向最优值收敛。
那么又出现一个问题,为什么满足了其中一个方程就能使得结果逐渐收敛呢?换个问法,它是怎么迭代计算满足该次得方程得呢?Kaczmarz通过把当前解向其他任意一个超平面投影得方式来解决这一问题。
试想一下,若干个超平面若相交,那么一个超平面中的点,向另一个超平面进行投影,新的投影点是不是距离最优解更进一步了呢?想不出来?没关系,下面这张二维空间求解图能帮助你理解。
接下来,举个简单的例子实现核心公式的推导。
若只对空间中的两个相邻点(N=2)求解粒子分布,最高采集到了系统矩阵和粒子信号的二次谐波频率,即M=2。数学上将N维空间超平面的求解,简化为求解二维空间中两(M)条直线的交点。求解过程如下:
假设两个方程在空间中的位置关系如下图所示:从初始的随机点开始,迭代k次之后到达S点,第k+1次迭代由S点向另一条直线映射,投影点为P点。P点所在方程为 s 1 ∗ c 1 + s 2 ∗ c 2 = u k + 1 s_1*c_1+s_2*c_2=u_{k+1} s1∗c1+s2∗c2=uk+1
可知向量
O
P
⃗
=
O
S
⃗
+
S
P
⃗
\vec{OP}=\vec{OS}+\vec{SP}
OP=OS+SP, 其中S为第k次迭代求得的结果(为已知点),记为
C
k
C_k
Ck,为了求
S
P
⃗
\vec{SP}
SP,做辅助线 AS 与被投影直线平行,过原点做投影直线的垂线,与两条线分别交于A,B两点,所以有:
S
P
⃗
=
A
B
⃗
,
A
B
⃗
=
O
B
⃗
−
O
A
⃗
,
\vec{SP} = \vec{AB}, \\ \vec{AB} = \vec{OB}-\vec{OA}, \\
SP=AB,AB=OB−OA,
求解
O
A
⃗
,
O
B
⃗
\vec{OA},\vec{OB}
OA,OB即可得到
S
P
⃗
\vec{SP}
SP;由直线方程可知,
A
B
⃗
\vec{AB}
AB的方向向量为
a
k
+
1
⃗
=
(
s
1
,
s
2
)
\vec{a_{k+1}}=(s_1,s_2)
ak+1=(s1,s2),单位方向向量为
e
⃗
=
a
k
+
1
⃗
∣
a
k
+
1
⃗
∣
\vec{e}=\frac{\vec{a_{k+1}}}{|\vec{a_{k+1}}|}
e=∣ak+1∣ak+1,因此,由点到直线的距离方程可得:
∣
O
B
⃗
∣
=
∣
s
1
∗
0
+
s
2
∗
0
+
u
k
+
1
∣
s
1
2
+
s
2
2
=
u
k
+
1
∣
a
k
+
1
⃗
∣
∣
O
A
⃗
∣
=
O
S
⃗
⋅
e
⃗
=
O
S
⃗
⋅
a
k
+
1
⃗
∣
a
k
+
1
⃗
∣
=
C
k
⋅
a
⃗
k
+
1
⃗
∣
a
⃗
k
+
1
⃗
∣
|\vec{OB}| = \frac{|s_1*0+s_2*0+u_{k+1}|}{\sqrt{s_1^2+s_2^2}} = \frac{u_{k+1}}{|\vec{a_{k+1}}|} \\ |\vec{OA}|=\vec{OS} \cdot \vec{e}=\vec{OS}\cdot\frac{\vec{a_{k+1}}}{|\vec{a_{k+1}}|}=\frac{\vec{C_k\cdot \vec a_{k+1}}}{|\vec{\vec a_{k+1}}|}
∣OB∣=s12+s22∣s1∗0+s2∗0+uk+1∣=∣ak+1∣uk+1∣OA∣=OS⋅e=OS⋅∣ak+1∣ak+1=∣ak+1∣Ck⋅ak+1
所以:
A
B
⃗
=
O
B
⃗
−
O
A
⃗
=
u
k
+
1
−
C
k
⋅
a
⃗
k
+
1
∣
a
k
+
1
⃗
∣
a
k
+
1
⃗
\vec{AB} = \vec{OB}-\vec{OA}=\frac{u_{k+1}-C_k \cdot \vec a_{k+1}}{|\vec{a_{k+1}}|}\vec{a_{k+1}}
AB=OB−OA=∣ak+1∣uk+1−Ck⋅ak+1ak+1
由此可得迭代公式:
O
P
⃗
=
O
S
⃗
+
u
k
+
1
−
C
k
⋅
a
⃗
k
+
1
∣
a
k
+
1
⃗
∣
a
k
+
1
⃗
∵
O
P
⃗
=
C
k
+
1
,
O
S
⃗
=
C
k
C
k
+
1
=
C
k
+
u
k
+
1
−
C
k
⋅
a
⃗
k
+
1
∣
a
k
+
1
⃗
∣
a
k
+
1
⃗
\vec{OP} =\vec{OS}+\frac{u_{k+1}-C_k \cdot \vec a_{k+1}}{|\vec{a_{k+1}}|}\vec{a_{k+1}} \\ \because \vec{OP} = C_{k+1}, \vec{OS}=C_{k}\\ C_{k+1}=C_{k}+\frac{u_{k+1}-C_k \cdot \vec a_{k+1}}{|\vec{a_{k+1}}|}\vec{a_{k+1}}
OP=OS+∣ak+1∣uk+1−Ck⋅ak+1ak+1∵OP=Ck+1,OS=CkCk+1=Ck+∣ak+1∣uk+1−Ck⋅ak+1ak+1
观察上述迭代公式,可以发现,迭代公式可以简单的理解为,第k+1次迭代为,第k次的结果加上 使用第k次的结果预测第k+1次时的偏差。
参考: