本征:如果我只能计算 Aty 和 Ax,是否有可能创建类似 LeastSquareDiagonalPreconditioner 的调节器?
Eigen: Is it possible to create LeastSquareDiagonalPreconditioner-like conditioner if i only can compute Aty and Ax?
我想求解像系统 A^t * A * x = -A^t * x
这样的最小二乘法。 (我正在为特殊问题实施高斯-牛顿法)。
我编写了特殊的例程来计算 A * x
和 A^t * y
乘积。有了这样的例程,由于 Eigen,可以很容易地使用无矩阵求解器。
但是我的方法收敛不如Eigen::LeastSquaresConjugateGradient
。我做了一个小测试,看起来 LeastSquareDiagonalPreconditioner
加快了收敛速度。
我的问题是 - 如果我只能计算矩阵乘积,我如何使用 LeastSquareDiagonalPreconditioner
或实现自己的预调节器?
顺便说一句,我不太了解 preconditioning/conjugate 渐变的东西。
编辑
为清楚起见 - 我想在我的产品例程中使用 Eigen 的无矩阵求解器。
编辑 2
矩阵向量乘积是通过对某些 objective 函数使用正向和反向模式自动微分获得的。
最简单的方法可能是实现您自己的预调节器 class 继承 DiagonalPreconditioner
并实现类似于 LeastSquareDiagonalPreconditioner ::factorize()
但适应您的类型的东西。基本上你需要计算:
m_invdiag(j) = 1./mat.col(j).squaredNorm();
对于所有列 j
使用您已经为产品运营商实施的策略。
我想求解像系统 A^t * A * x = -A^t * x
这样的最小二乘法。 (我正在为特殊问题实施高斯-牛顿法)。
我编写了特殊的例程来计算 A * x
和 A^t * y
乘积。有了这样的例程,由于 Eigen,可以很容易地使用无矩阵求解器。
但是我的方法收敛不如Eigen::LeastSquaresConjugateGradient
。我做了一个小测试,看起来 LeastSquareDiagonalPreconditioner
加快了收敛速度。
我的问题是 - 如果我只能计算矩阵乘积,我如何使用 LeastSquareDiagonalPreconditioner
或实现自己的预调节器?
顺便说一句,我不太了解 preconditioning/conjugate 渐变的东西。
编辑
为清楚起见 - 我想在我的产品例程中使用 Eigen 的无矩阵求解器。
编辑 2
矩阵向量乘积是通过对某些 objective 函数使用正向和反向模式自动微分获得的。
最简单的方法可能是实现您自己的预调节器 class 继承 DiagonalPreconditioner
并实现类似于 LeastSquareDiagonalPreconditioner ::factorize()
但适应您的类型的东西。基本上你需要计算:
m_invdiag(j) = 1./mat.col(j).squaredNorm();
对于所有列 j
使用您已经为产品运营商实施的策略。