为什么用 Eigen 和 OpenCV 计算的 SVD 左奇异向量有不同的符号
Why SVD left singular vectors computed with Eigen and OpenCV have different signs
我同时使用 OpenCV 和 Eigen 来计算 SVD:
Eigen:
JacobiSVD<Matrix3f> svd(myM, ComputeFullU);
OpenCV:
cvSVD(&myM, &w, &u, 0, CV_SVD_MODIFY_A | CV_SVD_U_T);
我关注的是左奇异向量:
Eigen result:
0.0341698 -0.064916 0.997306
0.950241 -0.307051 -0.0525437
0.309635 0.949476 0.051194
OpenCV result:
[0.03417001163639093, -0.06491612525262211, 0.9973055233913801;
-0.9502414121501213, 0.3070511298822651, 0.05254390804810754;
-0.3096347347112595, -0.9494764348419663, -0.05119404985032185]
虽然一个是float型,一个是double型,但计算出的左奇异向量符号不同。所以我的问题是:
- 这种符号差异真的很重要吗?
- 如何使它们相同?
不,没关系,因为相应的符号差也会出现在右奇异向量上,所以基本上
U * S * V^adjoint
会给你正确的结果。
更准确地说,来自维基百科:
Non-degenerate singular values always have unique left- and
right-singular vectors, up to multiplication by a unit-phase factor
exp(iφ)
(for the real case up to sign). Consequently, if all singular > values of M are non-degenerate and non-zero, then its singular value
decomposition is unique, up to multiplication of a column of U by a
unit-phase factor and simultaneous multiplication of the corresponding
column of V by the same unit-phase factor.
您为什么希望它们完全相同?如果你真的想要,你可以通过除第一个分量得到相位,然后乘以那个相位使它们相等。
由于奇异值的排序,可能还会出现额外的差异,afaik eigen 将它们按降序排列,opencv 不确定。
奇异值分解不是唯一的,有多种可能的分解。奇异值的实际集合是唯一的,但向量的左矩阵和右矩阵可以有不同的符号,这无关紧要,因为多个组合符号可以抵消。
一个明显的例子,对于 M = UΣV*
,像 M=(-U)Σ(-V*) = UΣV*
一样分解,但一般来说,左右奇异向量可以有不同的符号组合。
这种差异并不重要,所以我认为您不必费心尝试使它们相同。
不仅如此,奇异向量的顺序也可以变化。一般是奇异值降序排列。
我同时使用 OpenCV 和 Eigen 来计算 SVD:
Eigen:
JacobiSVD<Matrix3f> svd(myM, ComputeFullU);
OpenCV:
cvSVD(&myM, &w, &u, 0, CV_SVD_MODIFY_A | CV_SVD_U_T);
我关注的是左奇异向量:
Eigen result:
0.0341698 -0.064916 0.997306
0.950241 -0.307051 -0.0525437
0.309635 0.949476 0.051194
OpenCV result:
[0.03417001163639093, -0.06491612525262211, 0.9973055233913801;
-0.9502414121501213, 0.3070511298822651, 0.05254390804810754;
-0.3096347347112595, -0.9494764348419663, -0.05119404985032185]
虽然一个是float型,一个是double型,但计算出的左奇异向量符号不同。所以我的问题是:
- 这种符号差异真的很重要吗?
- 如何使它们相同?
不,没关系,因为相应的符号差也会出现在右奇异向量上,所以基本上
U * S * V^adjoint
会给你正确的结果。
更准确地说,来自维基百科:
Non-degenerate singular values always have unique left- and right-singular vectors, up to multiplication by a unit-phase factor
exp(iφ)
(for the real case up to sign). Consequently, if all singular > values of M are non-degenerate and non-zero, then its singular value decomposition is unique, up to multiplication of a column of U by a unit-phase factor and simultaneous multiplication of the corresponding column of V by the same unit-phase factor.您为什么希望它们完全相同?如果你真的想要,你可以通过除第一个分量得到相位,然后乘以那个相位使它们相等。
由于奇异值的排序,可能还会出现额外的差异,afaik eigen 将它们按降序排列,opencv 不确定。
奇异值分解不是唯一的,有多种可能的分解。奇异值的实际集合是唯一的,但向量的左矩阵和右矩阵可以有不同的符号,这无关紧要,因为多个组合符号可以抵消。
一个明显的例子,对于 M = UΣV*
,像 M=(-U)Σ(-V*) = UΣV*
一样分解,但一般来说,左右奇异向量可以有不同的符号组合。
这种差异并不重要,所以我认为您不必费心尝试使它们相同。
不仅如此,奇异向量的顺序也可以变化。一般是奇异值降序排列。