奇异值和奇异值分解
理論: 假設M是一個m×n階矩陣,其中的元素全部屬于域 K,也就是 實數域或復數域。如此則存在一個分解使得 M = UΣV*, 其中U是m×m階酉矩陣;Σ是半正定m×n階對角矩陣;而V*,即V的共軛轉置,是n×n階酉矩陣。這樣的分解就稱作M的奇異值分解。Σ對角線上的元素Σi,i即為M的奇異值。 直觀的解釋
在矩陣M的奇異值分解中 M = UΣV* ·U的列(columns)組成一套對M的正交"輸入"或"分析"的基向量。這些向量是M*M的特征向量。 ·V的列(columns)組成一套對M的正交"輸出"的基向量。這些向量是M*M的特征向量。 ·Σ對角線上的元素是奇異值,可視為是在輸入與輸出間進行的標量的"膨脹控制"。這些是M*M及MM*的奇異值,并與U和V的行向量相對應。 奇異值和奇異向量, 以及他們與奇異值分解的關系 一個非負實數σ是M的一個奇異值僅當存在Km 的單位向量u和Kn的單位向量v如下 : 其中向量u 和v分別為σ的左奇異向量和右奇異向量。 對于任意的奇異值分解,矩陣Σ的對角線上的元素等于M的奇異值. U和V的列分別是奇異值中的左、右奇異向量。因此,上述定理表明: 一個m × n的矩陣至少有一個最多有 p = min(m,n)個不同的奇異值。 總是可以找到在Km 的一個正交基U,組成M的左奇異向量。 總是可以找到和Kn的一個正交基V,組成M的右奇異向量。 如果一個奇異值中可以找到兩個左(或右)奇異向量是線性相關的,則稱為退化。 非退化的奇異值具有唯一的左、右奇異向量,取決于所乘的單位相位因子eiφ(根據實際信號)。因此,如果M的所有奇異值都是非退化且非零,則它的奇異值分解是唯一的,因為U中的一列要乘以一個單位相位因子且同時V中相應的列也要乘以同一個相位因子。 根據定義,退化的奇異值具有不唯一的奇異向量。因為,如果u1和u2為奇異值σ的兩個左奇異向量,則兩個向量的任意規范線性組合也是奇異值σ一個左奇異向量,類似的,右奇異向量也具有相同的性質。因此,如果M 具有退化的奇異值,則它的奇異值分解是不唯一的。 奇異值分解在統計中的主要應用為主成分分析(PCA),它是一種數據分析方法,用來找出大量數據中所隱含的“模式”,它可以用在模式識別,數據壓縮等方面。PCA算法的作用是把數據集映射到低維空間中去。 數據集的特征值(在SVD中用奇異值表征)按照重要性排列,降維的過程就是舍棄不重要的特征向量的過程,而剩下的特征向量張成空間為降維后的空間。 計算 SVD: matlab: [b c d]=svd(A) OpenCV: void cvSVD( CvArr* A, CvArr* W, CvArr* U=NULL, CvArr* V=NULL, int flags=0 )
在矩陣M的奇異值分解中 M = UΣV* ·U的列(columns)組成一套對M的正交"輸入"或"分析"的基向量。這些向量是M*M的特征向量。 ·V的列(columns)組成一套對M的正交"輸出"的基向量。這些向量是M*M的特征向量。 ·Σ對角線上的元素是奇異值,可視為是在輸入與輸出間進行的標量的"膨脹控制"。這些是M*M及MM*的奇異值,并與U和V的行向量相對應。 奇異值和奇異向量, 以及他們與奇異值分解的關系 一個非負實數σ是M的一個奇異值僅當存在Km 的單位向量u和Kn的單位向量v如下 : 其中向量u 和v分別為σ的左奇異向量和右奇異向量。 對于任意的奇異值分解,矩陣Σ的對角線上的元素等于M的奇異值. U和V的列分別是奇異值中的左、右奇異向量。因此,上述定理表明: 一個m × n的矩陣至少有一個最多有 p = min(m,n)個不同的奇異值。 總是可以找到在Km 的一個正交基U,組成M的左奇異向量。 總是可以找到和Kn的一個正交基V,組成M的右奇異向量。 如果一個奇異值中可以找到兩個左(或右)奇異向量是線性相關的,則稱為退化。 非退化的奇異值具有唯一的左、右奇異向量,取決于所乘的單位相位因子eiφ(根據實際信號)。因此,如果M的所有奇異值都是非退化且非零,則它的奇異值分解是唯一的,因為U中的一列要乘以一個單位相位因子且同時V中相應的列也要乘以同一個相位因子。 根據定義,退化的奇異值具有不唯一的奇異向量。因為,如果u1和u2為奇異值σ的兩個左奇異向量,則兩個向量的任意規范線性組合也是奇異值σ一個左奇異向量,類似的,右奇異向量也具有相同的性質。因此,如果M 具有退化的奇異值,則它的奇異值分解是不唯一的。 奇異值分解在統計中的主要應用為主成分分析(PCA),它是一種數據分析方法,用來找出大量數據中所隱含的“模式”,它可以用在模式識別,數據壓縮等方面。PCA算法的作用是把數據集映射到低維空間中去。 數據集的特征值(在SVD中用奇異值表征)按照重要性排列,降維的過程就是舍棄不重要的特征向量的過程,而剩下的特征向量張成空間為降維后的空間。 計算 SVD: matlab: [b c d]=svd(A) OpenCV: void cvSVD( CvArr* A, CvArr* W, CvArr* U=NULL, CvArr* V=NULL, int flags=0 )
總結
- 上一篇: 理解并取证:DLS网络架构和PPPOE数
- 下一篇: 《中秋书月》月圆之夜,我和德鲁克