本文主要是介绍DeepSORT(目标跟踪算法)中的解三角方程计算标准化残差(解线性方程组),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
DeepSORT(目标跟踪算法)中的解三角方程计算标准化残差(解线性方程组)
flyfish
《DeepSORT(目标跟踪算法)中的计算观测值与状态估计的马氏距离》这篇文章介绍了Cholesky 分解。Cholesky 分解将协方差矩阵分解成下三角矩阵,使得求解过程可以高效进行。这篇是利用 solve_triangular 函数,我们可以高效地解这些线性方程组,从而得到标准化残差和更新后的状态。
即上篇解释这句代码cholesky_factor = np.linalg.cholesky(covariance)
这篇解释下两句代码
d = measurements - mean
z = scipy.linalg.solve_triangular(cholesky_factor, d.T, lower=True, check_finite=False,overwrite_b=True)
验证下三角方程组
我们之前的下三角矩阵 L L L 和向量 b \mathbf{b} b 是:
L = [ 2 0 0 3 1 0 1 − 2 1 ] , b = [ 4 5 − 1 ] L = \begin{bmatrix} 2 & 0 & 0 \\ 3 & 1 & 0 \\ 1 & -2 & 1 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 4 \\ 5 \\ -1 \end{bmatrix} L= 23101−2001 ,b= 45−1
我们可以使用 scipy.linalg.solve_triangular 来求解方程 L x = b L \mathbf{x} = \mathbf{b} Lx=b。
import numpy as np
from scipy.linalg import solve_triangular# 定义下三角矩阵 L 和向量 b
L = np.array([[2, 0, 0],[3, 1, 0],[1, -2, 1]
])
b = np.array([4, 5, -1])# 解三角方程 Lx = b
x = solve_triangular(L, b, lower=True)print("解 x:", x)
验证上三角方程组
我们之前的上三角矩阵 U U U 和向量 b \mathbf{b} b 是:
U = [ 2 − 1 3 0 1 5 0 0 4 ] , b = [ 4 6 8 ] U = \begin{bmatrix} 2 & -1 & 3 \\ 0 & 1 & 5 \\ 0 & 0 & 4 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 4 \\ 6 \\ 8 \end{bmatrix} U= 200−110354 ,b= 468
同样,我们可以使用 scipy.linalg.solve_triangular 来求解方程 U x = b U \mathbf{x} = \mathbf{b} Ux=b。
# 定义上三角矩阵 U 和向量 b
U = np.array([[2, -1, 3],[0, 1, 5],[0, 0, 4]
])
b_upper = np.array([4, 6, 8])# 解三角方程 Ux = b
x_upper = solve_triangular(U, b_upper, lower=False)print("解 x (上三角):", x_upper)
运行结果
当你运行上述代码时,你应该看到与我们手动计算结果相同的解。
解 x (下三角): [ 2. -1. -5.]
解 x (上三角): [-3. -4. 2.]
手动计算过程
三角矩阵
三角矩阵是一种特殊的方阵,矩阵中所有在对角线一侧的元素都是零。根据零元素的位置,三角矩阵可以分为两种类型:
- 下三角矩阵 (Lower Triangular Matrix):
- 所有非零元素都在主对角线及其以下的位置。
- 形式如下: L = [ l 11 0 0 … 0 l 21 l 22 0 … 0 l 31 l 32 l 33 … 0 ⋮ ⋮ ⋮ ⋱ 0 l n 1 l n 2 l n 3 … l n n ] L = \begin{bmatrix} l_{11} & 0 & 0 & \ldots & 0 \\ l_{21} & l_{22} & 0 & \ldots & 0 \\ l_{31} & l_{32} & l_{33} & \ldots & 0 \\ \vdots & \vdots & \vdots & \ddots & 0 \\ l_{n1} & l_{n2} & l_{n3} & \ldots & l_{nn} \end{bmatrix} L= l11l21l31⋮ln10l22l32⋮ln200l33⋮ln3………⋱…0000lnn
- 上三角矩阵 (Upper Triangular Matrix):
- 所有非零元素都在主对角线及其以上的位置。
- 形式如下: U = [ u 11 u 12 u 13 … u 1 n 0 u 22 u 23 … u 2 n 0 0 u 33 … u 3 n ⋮ ⋮ ⋮ ⋱ u ( n − 1 ) n 0 0 0 … u n n ] U = \begin{bmatrix} u_{11} & u_{12} & u_{13} & \ldots & u_{1n} \\ 0 & u_{22} & u_{23} & \ldots & u_{2n} \\ 0 & 0 & u_{33} & \ldots & u_{3n} \\ \vdots & \vdots & \vdots & \ddots & u_{(n-1)n} \\ 0 & 0 & 0 & \ldots & u_{nn} \end{bmatrix} U= u1100⋮0u12u220⋮0u13u23u33⋮0………⋱…u1nu2nu3nu(n−1)nunn
三角方程组
三角方程组是由三角矩阵组成的线性方程组,由于其特殊的结构,解这类方程组的计算更加简单高效。三角方程组可以分为两种:
- 下三角方程组:
- 形式为 L x = b L \mathbf{x} = \mathbf{b} Lx=b,其中 L L L 是一个下三角矩阵, x \mathbf{x} x 是未知向量, b \mathbf{b} b 是已知向量。
- 解法从上到下进行,通过顺序消元法求解。
- 上三角方程组:
- 形式为 U x = b U \mathbf{x} = \mathbf{b} Ux=b,其中 U U U 是一个上三角矩阵, x \mathbf{x} x 是未知向量, b \mathbf{b} b 是已知向量。
- 解法从下到上进行,通过顺序回代法求解。
示例和求解过程
下三角方程组示例:
考虑下三角矩阵 L L L 和向量 b \mathbf{b} b:
L = [ 2 0 0 3 1 0 1 − 2 1 ] , b = [ 4 5 − 1 ] L = \begin{bmatrix} 2 & 0 & 0 \\ 3 & 1 & 0 \\ 1 & -2 & 1 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 4 \\ 5 \\ -1 \end{bmatrix} L= 23101−2001 ,b= 45−1
我们要解方程 L x = b L \mathbf{x} = \mathbf{b} Lx=b,其中 x \mathbf{x} x 是未知向量。
- 首先,解第一个方程: 2 x 1 = 4 ⟹ x 1 = 2 2x_1 = 4 \implies x_1 = 2 2x1=4⟹x1=2
- 接着,解第二个方程: 3 x 1 + x 2 = 5 ⟹ 3 ⋅ 2 + x 2 = 5 ⟹ x 2 = 5 − 6 = − 1 3x_1 + x_2 = 5 \implies 3 \cdot 2 + x_2 = 5 \implies x_2 = 5 - 6 = -1 3x1+x2=5⟹3⋅2+x2=5⟹x2=5−6=−1
- 最后,解第三个方程: 1 x 1 − 2 x 2 + x 3 = − 1 ⟹ 1 ⋅ 2 − 2 ⋅ ( − 1 ) + x 3 = − 1 ⟹ 2 + 2 + x 3 = − 1 ⟹ x 3 = − 1 − 4 = − 5 1x_1 - 2x_2 + x_3 = -1 \implies 1 \cdot 2 - 2 \cdot (-1) + x_3 = -1 \implies 2 + 2 + x_3 = -1 \implies x_3 = -1 - 4 = -5 1x1−2x2+x3=−1⟹1⋅2−2⋅(−1)+x3=−1⟹2+2+x3=−1⟹x3=−1−4=−5
因此,解为:
x = [ 2 − 1 − 5 ] \mathbf{x} = \begin{bmatrix} 2 \\ -1 \\ -5 \end{bmatrix} x= 2−1−5
上三角方程组示例:
考虑上三角矩阵 U U U 和向量 b \mathbf{b} b:
U = [ 2 − 1 3 0 1 5 0 0 4 ] , b = [ 4 6 8 ] U = \begin{bmatrix} 2 & -1 & 3 \\ 0 & 1 & 5 \\ 0 & 0 & 4 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 4 \\ 6 \\ 8 \end{bmatrix} U= 200−110354 ,b= 468
我们要解方程 U x = b U \mathbf{x} = \mathbf{b} Ux=b。
- 首先,解最后一个方程: 4 x 3 = 8 ⟹ x 3 = 2 4x_3 = 8 \implies x_3 = 2 4x3=8⟹x3=2
- 接着,解倒数第二个方程: x 2 + 5 x 3 = 6 ⟹ x 2 + 5 ⋅ 2 = 6 ⟹ x 2 = 6 − 10 = − 4 x_2 + 5x_3 = 6 \implies x_2 + 5 \cdot 2 = 6 \implies x_2 = 6 - 10 = -4 x2+5x3=6⟹x2+5⋅2=6⟹x2=6−10=−4
- 最后,解第一个方程: 2 x 1 − x 2 + 3 x 3 = 4 ⟹ 2 x 1 − ( − 4 ) + 3 ⋅ 2 = 4 ⟹ 2 x 1 + 4 + 6 = 4 ⟹ 2 x 1 = 4 − 10 = − 6 ⟹ x 1 = − 3 2x_1 - x_2 + 3x_3 = 4 \implies 2x_1 - (-4) + 3 \cdot 2 = 4 \implies 2x_1 + 4 + 6 = 4 \implies 2x_1 = 4 - 10 = -6 \implies x_1 = -3 2x1−x2+3x3=4⟹2x1−(−4)+3⋅2=4⟹2x1+4+6=4⟹2x1=4−10=−6⟹x1=−3
因此,解为:
x = [ − 3 − 4 2 ] \mathbf{x} = \begin{bmatrix} -3 \\ -4 \\ 2 \end{bmatrix} x= −3−42
再把上一篇和这一篇结合起来
我们看 scipy.linalg.solve_triangular 这句代码是如何通过解三角方程计算标准化残差的。
示例和解释
假设我们有如下矩阵 A A A:
[ 4 12 − 16 12 37 − 43 − 16 − 43 98 ] \begin{bmatrix}4 & 12 & -16 \\ 12 & 37 & -43 \\ -16 & -43 & 98 \end{bmatrix} 412−161237−43−16−4398
我们已经通过 Cholesky 分解将 ( A ) 分解为下三角矩阵 ( L ):
L = [ 2 0 0 6 1 0 − 8 5 3 ] L = \begin{bmatrix} 2 & 0 & 0 \\ 6 & 1 & 0 \\ -8 & 5 & 3 \end{bmatrix} L= 26−8015003
现在假设我们有一个测量向量:
measurement = [ 2 − 1 3 ] \text{measurement} = \begin{bmatrix} 2 \\ -1 \\ 3 \end{bmatrix} measurement= 2−13
步骤解释
- 计算差值 ( d ):
差值 ( d ) 是测量向量与均值向量的差。假设均值向量 ( \mu ) 为:
μ = [ 1 0 2 ] \mu = \begin{bmatrix} 1 \\ 0 \\ 2 \end{bmatrix} μ= 102
则差值 ( d ) 为:
d = measurement − μ = [ 2 − 1 3 ] − [ 1 0 2 ] = [ 1 − 1 1 ] d = \text{measurement} - \mu = \begin{bmatrix} 2 \\ -1 \\ 3 \end{bmatrix} - \begin{bmatrix} 1 \\ 0 \\ 2 \end{bmatrix} = \begin{bmatrix} 1 \\ -1 \\ 1 \end{bmatrix} d=measurement−μ= 2−13 − 102 = 1−11 - Cholesky 分解:
我们已经知道 ( L ) 为:
L = [ 2 0 0 6 1 0 − 8 5 3 ] L = \begin{bmatrix} 2 & 0 & 0 \\ 6 & 1 & 0 \\ -8 & 5 & 3 \end{bmatrix} L= 26−8015003 - 解三角方程:
scipy.linalg.solve_triangular
用于求解三角方程组。具体来说,solve_triangular
函数解决如下方程:
L z = d Lz = d Lz=d
其中 ( d ) 是差值向量,( L ) 是下三角矩阵,( z ) 是标准化残差向量。
我们用scipy.linalg.solve_triangular
来解这个方程:
import numpy as np
from scipy.linalg import cholesky, solve_triangular
# 定义矩阵和向量
L = np.array([
[2, 0, 0],
[6, 1, 0],
[-8, 5, 3]
])
d = np.array([1, -1, 1])
# 解三角方程
z = solve_triangular(L, d, lower=True)
print("Standardized residual (z):", z)
结果
Standardized residual (z): [ 0.5 -4. 8.33333333]
具体数值计算
手动求解 L z = d Lz = d Lz=d
[ 2 0 0 6 1 0 − 8 5 3 ] [ z 1 z 2 z 3 ] = [ 1 − 1 1 ] \begin{bmatrix} 2 & 0 & 0 \\ 6 & 1 & 0 \\ -8 & 5 & 3 \end{bmatrix} \begin{bmatrix} z_1 \\ z_2 \\ z_3 \end{bmatrix} = \begin{bmatrix} 1 \\ -1 \\ 1 \end{bmatrix} 26−8015003 z1z2z3 = 1−11
我们逐步求解:
- 第一个方程:
2 z 1 = 1 2z_1 = 1 2z1=1
z 1 = 1 2 = 0.5 z_1 = \frac{1}{2} = 0.5 z1=21=0.5 - 第二个方程:
6 z 1 + z 2 = − 1 6z_1 + z_2 = -1 6z1+z2=−1
6 ⋅ 0.5 + z 2 = − 1 6 \cdot 0.5 + z_2 = -1 6⋅0.5+z2=−1
3 + z 2 = − 1 3 + z_2 = -1 3+z2=−1
z 2 = − 4 z_2 = -4 z2=−4 - 第三个方程:
− 8 z 1 + 5 z 2 + 3 z 3 = 1 -8z_1 + 5z_2 + 3z_3 = 1 −8z1+5z2+3z3=1
− 8 ⋅ 0.5 + 5 ⋅ ( − 4 ) + 3 z 3 = 1 -8 \cdot 0.5 + 5 \cdot (-4) + 3z_3 = 1 −8⋅0.5+5⋅(−4)+3z3=1
− 4 − 20 + 3 z 3 = 1 -4 - 20 + 3z_3 = 1 −4−20+3z3=1
− 24 + 3 z 3 = 1 -24 + 3z_3 = 1 −24+3z3=1
3 z 3 = 25 3z_3 = 25 3z3=25
z 3 = 25 3 ≈ 8.33 z_3 = \frac{25}{3} \approx 8.33 z3=325≈8.33
所以标准化残差向量 ( z ) 是:
z = [ 0.5 − 4 8.33 ] z = \begin{bmatrix} 0.5 \\ -4 \\ 8.33 \end{bmatrix} z= 0.5−48.33
DeepSORT(目标跟踪算法)中的马氏距离详解(很详细)
DeepSORT(目标跟踪算法)中 可以设置阈值进行异常检测或目标跟踪的原因(写了重要步骤)
这篇关于DeepSORT(目标跟踪算法)中的解三角方程计算标准化残差(解线性方程组)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!