SciPy为非线性最小二乘问题提供了两个函数:
optimize.leastsq()
仅使用Levenberg-Marquardt算法.
optimize.least_squares()
允许我们选择Levenberg-Marquardt,Trust Region Reflective或Trust Region Dogleg算法.
我们应该总是用least_squares()
而不是leastsq()
吗?
如果是这样,后者的目的是什么?
我正在寻找一个C语言库,它将对目标函数进行优化(最好是Levenberg-Marquardt算法),并且将支持框约束,线性不等式约束和非线性不等式约束.
我已经尝试了几个库,但它们都没有为我的应用程序使用必要的约束类型:
我目前正在探索NLopt,但我不确定我是否可以使用任何提供的算法实现最小二乘法.
我发现很难相信没有一个库可以支持这个问题的全部限制,所以我猜我在google搜索时出错了.
我最近发现我可以从C调用Matlab函数.虽然这很容易解决问题,但我不想从C调用Matlab函数.根据我的经验,这并不快.
任何帮助将不胜感激.
我们希望使用iBeacons实现某种室内位置确定. 本文看起来非常有趣,其中作者使用Eigen C++库和Levenberg Marquardt算法实现了非线性最小二乘三角剖分.由于Eigen是用C++编写的,我试图使用JNI和Android NDK来使用它,但它会引发很多错误,我不知道如何解决,我也无法在网上找到任何东西.我也尝试使用Jeigen,但它没有我们需要的所有功能.
所以,我的问题是:
有人曾在Android中使用信标实现某种Trilateration吗?
您认为使用Eigen + JNI + NDK是一个很好的解决方案吗?如果是,您是否曾使用该组合实施Levenberg Marquardt?
有没有比Levenberg Marquardt算法更好的选项来计算Android应用程序中的三边测量?
我正在寻找用于非线性最小二乘拟合的Levenberg-Marquardt算法的C#实现.
由于 Excel Solver 在数千次优化上运行速度相当慢(原因是它使用电子表格作为界面),我试图在 C++ 中实现类似的(特定于问题的)求解器(使用 Visual Studio 2010,在 Win 上) 7 64 位平台)。我会通过 VBA 中的 Declare 语句包含 DLL,并且已经有这样做的经验,所以这不是问题。
我的问题是最小化经验数据和非线性但平滑的目标函数之间的平方误差之和,并且问题将包括非负性(X>=0)甚至正性约束(例如X>=0.00000001) ,其中 X 表示决策变量。
我正在寻找一个强大的、经过验证的实现。它可能是已建立的图书馆的一部分。例如,我已经研究过 ALGLIB 所存储的内容(请参阅http://www.alglib.net/optimization/),并且似乎只有他们的算法之一接受有界约束。但我不知道它的价值是什么,这就是为什么我试图收集一些意见。
或者,另一方面,是否建议用这样的基本约束来增强 ALGLIB 的 Levenberg-Marquardt 算法,例如拒绝每个不满足我的约束的中间解决方案?(我猜这不会成功,但仍然值得一问)
我试图重现Kostakis的纸张解决方案.在本文中,使用de Heligman-Pollard模型将删节死亡率表扩展为完整的生命表.该模型有8个参数必须安装.作者使用了改进的Gauss-Newton算法; 该算法(E04FDF)是NAG计算机程序库的一部分.Levenberg Marquardt不应该产生相同的参数集吗?我的代码或LM算法的应用有什么问题?
library(minpack.lm)
## Heligman-Pollard is used to expand an abridged table.
## nonlinear least squares algorithm is used to fit the parameters on nqx observed over 5 year intervals (5qx)
AGE <- c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70)
MORTALITY <- c(0.010384069, 0.001469140, 0.001309318, 0.003814265, 0.005378395, 0.005985625, 0.006741766, 0.009325056, 0.014149626, 0.021601755, 0.034271934, 0.053836246, 0.085287751, 0.136549522, 0.215953304)
## The start parameters for de Heligman-Pollard Formula (Converged set a=0.0005893,b=0.0043836,c=0.0828424,d=0.000706,e=9.927863,f=22.197312,g=0.00004948,h=1.10003)
## I …
Run Code Online (Sandbox Code Playgroud) r nonlinear-functions nonlinear-optimization model-fitting levenberg-marquardt
我使用Levenberg-Marquardt算法来最小化6个参数的非线性函数.每次最小化我有大约50个数据点,但是我得不到足够准确的结果.我的参数相差几个数量级的事实是否非常重要?如果是,我应该在哪里寻找解决方案?如果不是,您在工作中遇到的LMA有哪些限制(可能有助于找到我的应用中的其他问题)?非常感谢您的帮助.
编辑:我想解决的问题是确定最佳转换T:
typedef struct
{
double x_translation, y_translation, z_translation;
double x_rotation, y_rotation, z_rotation;
} transform_3D;
Run Code Online (Sandbox Code Playgroud)
使3D点集合适合3D线条.详细地说,我有一组3D点的坐标和相应3D线的方程,这些坐标应该通过这些点(在理想情况下).LMA正在最小化变换的3D点到相应的3D线的距离的总和.变换函数如下:
cv::Point3d Geometry::transformation_3D(cv::Point3d point, transform_3D transformation)
{
cv::Point3d p_odd,p_even;
//rotation x
p_odd.x=point.x;
p_odd.y=point.y*cos(transformation.x_rotation)-point.z*sin(transformation.x_rotation);
p_odd.z=point.y*sin(transformation.x_rotation)+point.z*cos(transformation.x_rotation);
//rotation y
p_even.x=p_odd.z*sin(transformation.y_rotation)+p_odd.x*cos(transformation.y_rotation);
p_even.y=p_odd.y;
p_even.z=p_odd.z*cos(transformation.y_rotation)-p_odd.x*sin(transformation.y_rotation);
//rotation z
p_odd.x=p_even.x*cos(transformation.z_rotation)-p_even.y*sin(transformation.z_rotation);
p_odd.y=p_even.x*sin(transformation.z_rotation)+p_even.y*cos(transformation.z_rotation);
p_odd.z=p_even.z;
//translation
p_even.x=p_odd.x+transformation.x_translation;
p_even.y=p_odd.y+transformation.y_translation;
p_even.z=p_odd.z+transformation.z_translation;
return p_even;
}
Run Code Online (Sandbox Code Playgroud)
希望这个解释会有所帮助......
EDIT2:
一些示例性数据粘贴在下面.3D线由中心点和方向矢量描述.所有线的中心点都是(0,0,0),每个矢量的'uz'坐标等于1.方向矢量的'ux'坐标集:
-1.0986, -1.0986, -1.0986,
-1.0986, -1.0990, -1.0986,
-1.0986, -1.0986, -0.9995,
-0.9996, -0.9996, -0.9995,
-0.9995, -0.9995, -0.9996,
-0.9003, -0.9003, -0.9004,
-0.9003, -0.9003, -0.9003,
-0.9003, -0.9003, -0.8011,
-0.7020, -0.7019, -0.6028,
-0.5035, -0.5037, …
Run Code Online (Sandbox Code Playgroud) 我是OpenCV的新手,我必须执行一些相机校准功能.谁能告诉我CvLevMarq()
OpenCV 中类的用途以及如何使用它?