- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试最小化以下示例函数:
F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
最小化这种函数的一般方法是 Levenberg-Marquardt 算法。我想在 C++ 中执行这个最小化并做了一些初步测试使用 Eigen 得出预期的解决方案。
我的问题如下:我习惯于在 python 中使用 scipy.optimize.fmin_powell
进行优化。这里输入函数参数为 (func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, direc=None)
。所以我可以定义一个 func(x0)
,给出 x0
vector 并开始优化。如果需要我可以改变优化参数。
现在,Eigen Lev-Marq 算法以不同的方式工作。我需要定义一个函数 vector (为什么?)此外,我无法设置优化参数。根据:
http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1LevenbergMarquardt.html
我应该可以使用 setEpsilon()
和其他设置函数。
但是当我有以下代码时:
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);
lm.setEpsilon(); //doesn't exist!
所以我有两个问题:
为什么需要函数 vector ,为什么函数标量不够?
我搜索过答案的引用文献:
http://www.ultimatepp.org/reference$Eigen_demo$en-us.html
http://www.alglib.net/optimization/levenbergmarquardt.php
如何使用set函数设置优化参数?
最佳答案
所以我相信我已经找到了答案。
1) 函数既可以作为函数 vector ,也可以作为函数标量。
如果有 m
个可解参数,则需要创建或计算一个 m x m 的雅可比矩阵。为了进行矩阵 vector 乘法 J(x[m]).transpose*f(x[m])
函数 vector f(x)
应该有 m
个项目。这可以是 m
不同的功能,但我们也可以给 f1
完整的功能,使其他项目 0
。
2) 可以使用lm.parameters.maxfev = 2000;
两个答案都已在以下示例代码中进行了测试:
#include <iostream>
#include <Eigen/Dense>
#include <unsupported/Eigen/NonLinearOptimization>
#include <unsupported/Eigen/NumericalDiff>
// Generic functor
template<typename _Scalar, int NX = Eigen::Dynamic, int NY = Eigen::Dynamic>
struct Functor
{
typedef _Scalar Scalar;
enum {
InputsAtCompileTime = NX,
ValuesAtCompileTime = NY
};
typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1> InputType;
typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1> ValueType;
typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;
int m_inputs, m_values;
Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}
Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {}
int inputs() const { return m_inputs; }
int values() const { return m_values; }
};
struct my_functor : Functor<double>
{
my_functor(void): Functor<double>(2,2) {}
int operator()(const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const
{
// Implement y = 10*(x0+3)^2 + (x1-5)^2
fvec(0) = 10.0*pow(x(0)+3.0,2) + pow(x(1)-5.0,2);
fvec(1) = 0;
return 0;
}
};
int main(int argc, char *argv[])
{
Eigen::VectorXd x(2);
x(0) = 2.0;
x(1) = 3.0;
std::cout << "x: " << x << std::endl;
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);
lm.parameters.maxfev = 2000;
lm.parameters.xtol = 1.0e-10;
std::cout << lm.parameters.maxfev << std::endl;
int ret = lm.minimize(x);
std::cout << lm.iter << std::endl;
std::cout << ret << std::endl;
std::cout << "x that minimizes the function: " << x << std::endl;
std::cout << "press [ENTER] to continue " << std::endl;
std::cin.get();
return 0;
}
关于c++ - 如何使用 Eigen 不受支持的 levenberg marquardt 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18509228/
我正在使用 Levenberg-Marquardt algorithm最小化 6 个参数的非线性函数。每次最小化我有大约 50 个数据点,但我没有得到足够准确的结果。我的参数彼此相差几个数量级这一事实
我有一些代码可以使理论预测与实验数据相吻合,我想运行 LMA(Levenberg-Marquardt 算法)以使理论与实验相吻合。然而,计算是非常重要的,每个模型在单个处理器上需要大约 10-30 分
我是一名程序员,想了解 Levenberg–Marquardt 曲线拟合算法的工作原理,以便自己实现。是否有任何好的教程可以详细解释它是如何与作为程序员而不是数学家的读者一起工作的。 我的目标是在 o
问题:我最近的任务是设计一个非线性求解器,但我的求解器没有收敛到正确的解。 **预期**:“最小化(x)”方法应该将我的参数 vector x 减少到最小值。 观察到:在我调用“最小化(x)”之后,我
我尝试基于 Numerical Optimization using the Levenberg-Marquardt Algorithm 在 Julia 上实现用于求解非线性方程的 levenberg
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我通常使用 MATLAB 编写代码,但出于某些原因我决定改用 JAVA 方法。 问题很简单:我想了解如何将以下 MATLAB 代码转换为有效的 JAVA 代码。 在 MATLAB 中,我有一个名为 f
我能够使用 peak-o-mat 将曲线拟合到 x/y 数据集, 如下所示。那是线性背景和 10 条洛伦兹曲线。 因为我需要拟合许多相似的曲线,所以我使用 mpfit.py 编写了一个脚本化的拟合例程
我正在将 Matlab 中使用 Levenberg-Marquardt 训练算法的神经网络代码移植到 Python。我正在使用 Neurolab,我相信 Levenberg-Marquardt 训练算
我正在尝试使用 Matlab 中的 levenberg-Marquardt 最小二乘法将具有四个未知参数的巨大函数拟合到我的数据中。我使用了这个命令: [x, resnorm]=lsqcurvefit
我有一个关于如何在 Python 中使用 Levenberg-Marquardt 优化方法的问题。 SCIPY库里有很多optimization methods . 我尝试了两种方法(Nelder-M
我正在尝试将 Levenberg-Marquardt 算法实现为 Keras 优化器,如所述 here但我有几个问题,最大的一个是这个错误 TypeError: Tensor objects are
我正在尝试用 Java 编写 levenberg marquardt,这是我的代码: while (iter <= 10 || mse < 0.0001) { call.cal
我成功地使用了 Eigen 的 Levenberg-Marquart 类,示例来自:http://techblog.rga.com/determining-indoor-position-using-
我正在尝试最小化以下示例函数: F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1]) 最小化这种函数的一般方法是 Leven
在相机校准中,我使用 calibrateCamera() 从校准图案的多个 View 中查找相机参数。它恰恰做了两件事: 1) 假设镜头畸变为零,估计封闭形式的初始相机参数。 2) 运行全局 Leve
我正在尝试根据 Manolis Lourakis ( Available here) ) 用 C 语言编写的 Levenberg-Marquardt 算法构建 mex 文件。我已经做了很多搜索,但还没
我在最小化 python 中的复杂非线性函数时遇到了麻烦。该函数实际上是用于拟合实验数据的拟合模型的卡方。为了获得全局最小值,我使用 scipy 中的 basshopping 函数。该函数是 mini
我正在使用 Matlab 中的 lsqcurvefit 函数对一些实验数据进行建模。数据采用特定形状,因此算法只是调整该形状的系数以改变其振幅等。 该模型运行良好并且拟合良好(我计算了卡方)。 Lev
我是一名优秀的程序员,十分优秀!