Bootstrap

最小二乘估计和奇异值分解(SVD)

一 背景

最小二乘估计(Least Square Estimation)是方程参数估测的常用方法之一,在机器人视觉中应用广泛,在估计相机参数矩阵(Cameral calibration matrix)、单应矩阵(Homography)、基本矩阵(Fundamental matrix)、本质矩阵(Essential matrix)中都有使用,这种估计方法称为DLT(Direct Linear Transformation)算法。
在进行最小二乘估计时,常采用SVD(Singular Value Decomposition)方法。

二 数学计算

1 最小二乘估计

在估算单应矩阵时,会用到DLT算法,其核心就是SVD方法,基本流程见下图。其中方程形式为Ah=0,A是2n*9矩阵,n为采样点数量,h是1*9矩阵。
图1 DLT算法流程
书[Hartley, 2003]中介绍到,A经过SVD可以得到A=UDVT,其中D是对角矩阵,对角元素按照从大到小排列。那么结论是,V的最后一列等于h,也就是说V的最后一列的9个元素,就是h内9个元素的估算结果。
在做最小二乘估计时,其实不需要完整进行SVD分解,只需要得到AT*A的最小特征值对应的特征向量即可,因为这个向量就是上面所说的V的最后一列。

2 SVD(奇异值分解)

矩阵奇异值分解的数学表示是A=UDVT,其中,D是对角矩阵,其值是AT*A的特征值的平方根,叫做奇异值,具体可参考[Zeng, 2015]。

3 特征值和特征向量

特征值和特征向量的基本算法有四种——定义法、幂法、雅各比(Jacobi)法和QR法。定义法就是从矩阵特征值和特征向量的定义出发,可参考[Lay, 2007],定义法适用于无误差的情况,而在计算机视觉的实际应用中,采集的数据有人工误差的引入,因此不适用。幂法的缺点是可能遗漏特征值,而这里需要知道最小特征值,因此也不适用。雅各比(Jacobi)法和QR法都能够求取所有特征值,也能够得到所有特征向量,因而适合与我们的应用背景。
我们目前适用的是雅各比(Jacobi)法,具体参考[Zhou, 2014]。需要注明的是,该博客所分享的代码中,第28行,对dbMax取的第一个值时,我认为应该取矩阵元素的绝对值,而不是其元素值本身。另外,Jacobi法的使用前提是原始矩阵为实对称阵。

Python程序

主函数:

import SVD

#------------------------------------------------
# main 
if __name__ == "__main__":
    print("Hello world")

    arr = [1., 2., 3.,
            7., 8., 9.]

    # doing SVD (single value decompositioin)
    eigens_sorted2 = SVD.Doing_svd(arr, 2, 3)

    print(eigens_sorted2)

SVD类:

from math import *

PI = 3.1415926

#------------------------------------------------
# Matrix math : dot prodict and transpose
#------------------------------------------------
def getTranspose(arr, nRow, nCol):
    arrTrans = []

    nRowT = nCol
    nColT = nRow

    i = 0
    j = 0
    while i<nRowT:
        j = 0
        while j<nColT:
            arrTrans.append(arr[j*nCol+i])
            j += 1
        i += 1


    return arrTrans

#------------------------------------------------
def getDotProduct_ATransA(arr, nRow, nCol):
    result = []
    arrTrans = getTranspose(arr, nRow, nCol)
    #print("trans")
    #epiACounter = 0
    #for ele in arrTrans:
    
;