可以参考这篇知乎:LM算法
也可以参考这篇论文:LM算法论文
这里主要是记录使用Math.Net快速实现该算法。
Math.NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算/科学运算,它是C#开发的开源类库。Math.NET含了一个支持线性代数的解析器,分析复杂微分,解方程等等功能。这个项目大部分采用的是MIT/X11开源软件协议。目前该组件主要分为以下几个子项目,该组件同时也支持Mono,最新版本通过.NET标准库支持的平台也非常广泛
这里有个博主介绍的非常详细
Math.Net
目标公式:y=A∙x^B
问题描述,已知x和y,确定参数A和B
使用 MathNet.Numerics.Optimization和MathNet.Numerics.LinearAlgebra;
Vector<double> Func(Vector<double> p, Vector<double> x)
{
var result = CreateVector.Dense<double>(x.Count);
//y=A∙x^B
for (int i = 0; i <result.Count; i++)
{
result[i] = p[0] * Math.Pow(Fit.Re[(int)x[i]], p[1]) ;
}
return result;
}
var obj = ObjectiveFunction.NonlinearModel(Func,x, y);
var solver = new LevenbergMarquardtMinimizer(stepTolerance:1e-8, maximumIterations: 100);
var ResultMatrix = solver.FindMinimum(obj, Param);//这里Param为初始的参数
for (int i = 0; i < Param.Count; i++)
{
ParamFit[i] = ResultMatrix.MinimizingPoint[i];
}