下一节:非厄米特特征值问题 上一级:奇异值分解 上一节:数值示例

相关问题
  J. Demmel

如第§2.4.7节所述,有多个与SVD紧密相关的问题,其解决方案在此描述。这份清单并不详尽,因为低秩矩阵近似(其中“最优”的是由截断SVD提供)在应用中非常普遍。根据应用场景,可能适合使用此处描述的SVD算法或其他低秩近似方法。

  1. **商或广义SVD** 对于矩阵AB,定义如下。首先假设Amn列,Bnn列且非奇异。设AB^{-1}的SVD为U \Sigma V^*。于是,我们也可以写出AB的两种等价分解形式: A = U \Sigma_A XB = V \Sigma_B X,其中Xnn列且非奇异, \Sigma_A = {\rm diag} (\sigma_{A,1},\ldots,\sigma_{A,n})mn列,而 \Sigma_B = {\rm diag} (\sigma_{B,1},\ldots,\sigma_{B,n})nn列, 且满足 \sigma_{A,i}^2 + \sigma_{B,i}^2 = 1。 于是,\Sigma = \Sigma_A \Sigma_B^{-1} = {\rm diag} (\sigma_1,\ldots,\sigma_n)。 这些值 \sigma_i = \sigma_{A,i} / \sigma_{B,i} 被称为AB的**广义奇异值**。

    使用变换方法的软件(即适用于密集矩阵)在LAPACK驱动程序xGGSVD中可用,适用于更一般的情况,即B为奇异或pn列。MATLAB命令gsvd也提供了这一功能。ScaLAPACK软件尚未提供相应功能。使用这些算法的优势仅在于精度;即当B为病态时,它们比直接计算AB^{-1}的SVD要精确得多。但这些算法也相对较慢,因此如果B为良态,直接计算AB^{-1}的SVD会更好。

    AB为大型稀疏矩阵且B为方阵、非奇异并可分解时,我们推荐应用上述仅需要乘以AB^{-1}及其转置的SVD算法。

    如果B不是方阵,我们推荐使用第5章中的技术,求解广义厄米特征值问题A^*A - \lambda B^*B的特征值和特征向量。这是因为A^*A - \lambda B^*B的特征分解为 X^*A^*AX = \Sigma_A^* \Sigma_AX^*B^*BX = \Sigma_B^* \Sigma_B

  2. 还可以为 AB(而非AB^{-1},即**乘积SVD**)或任意形式的乘积A_1^{\pm 1} A_2^{\pm 1} \cdots A_k^{\pm 1}定义**更多广义SVD**。LAPACK、ScaLAPACK或MATLAB中没有针对这些情况的专业软件。因此,在密集情况下,需要显式形成这些乘积(尽管已有算法建议避免这种情况[54,3,53]),而在稀疏情况下,可以通过不显式形成它们的方式进行乘法运算。

  3. 寻找使\Vert Ax - b \Vert _2最小化的x,即**线性最小二乘问题**。 假设Amn列且m>n;此时我们称最小二乘问题为**超定**。如果A是非奇异的, A = U_n \Sigma_n V_n^*A的薄SVD,那么解为 x = V_n \Sigma_n^{-1} U_n^*b。通常,解法线性方程组A^*Ax = A^*b或使用QR分解A = QR计算x = R^{-1}Q^*b更经济,但当A条件极差,即\sigma_n \ll \sigma_1时,SVD可以更精确。特别是当A非常病态时,通常使用A的截断SVD而不是薄SVD:x = V_t \Sigma_t^{-1} U_t^*b

    解决最小二乘问题时,无需显式计算A的薄SVD或截断SVD。对于密集问题,LAPACK驱动程序xGELSD是首选方法,它使用分治法快速求解最小二乘问题,无需显式形成薄SVD。在ScaLAPACK中,只有计算薄SVD的程序PxGESVD,可用于最小二乘问题。对于稀疏问题,我们可以使用从方程(6.7)或(6.8)导出的近似分解A \approx U_k B_k V_k^*来得到x = V_k B_k^{-1} U_k^{-1}

    



下一节:非厄米特特征值问题 上一级:奇异值分解 上一节:数值示例
Susan Blackford 2000-11-20