C# 在C语言中使用非线性平方拟合#
我试图找到一个fit函数,其形式如下:C# 在C语言中使用非线性平方拟合#,c#,alglib,function-fitting,C#,Alglib,Function Fitting,我试图找到一个fit函数,其形式如下: f(x) = P / (1 + e^((x + m) / s) 其中,p是一个已知常数。我将这个函数拟合到一个测量的双精度列表(20-100个元素之间),所有这些值都有一个对应的x值。我对C#比较陌生,对数学也不是很在行,所以我觉得很难阅读现有的文档 我试过使用AlgLib,但不知道从哪里开始,或者使用什么函数。 编辑:为了精确地说明我在寻找什么:我想找到一个C方法,在这里我可以传递函数形式,以及一些坐标(x和y值),并让该方法返回两个未知变量(上面的s
f(x) = P / (1 + e^((x + m) / s)
其中,p
是一个已知常数。我将这个函数拟合到一个测量的双精度列表(20-100个元素之间),所有这些值都有一个对应的x值。我对C#比较陌生,对数学也不是很在行,所以我觉得很难阅读现有的文档
我试过使用AlgLib,但不知道从哪里开始,或者使用什么函数。
编辑:为了精确地说明我在寻找什么:我想找到一个C方法,在这里我可以传递函数形式,以及一些坐标(x和y值),并让该方法返回两个未知变量(上面的s和m) 我每天使用AlgLib就是为了这个目的。如果您转到链接并一直向下滚动,您会发现包含多种语言(包括C#)的代码示例的文档,我认为这将对您有很大帮助: 对于你的问题,你应该考虑所有你需要的约束,但是一个简单的例子,得到一个非线性最小二乘拟合你的输入函数和数据将看起来像这样:
public SomeReturnObject Optimize(SortedDictionary<double, double> dataToFitTo, double p, double initialGuessM, double initialGuessS)
{
var x = new double[dataToFitTo.Count,1];
for(int i=0; i < dataToFitTo.Count; i++)
{
x[i, 0] = dataToFitTo.Keys.ElementAt(i);
}
var y = dataToFitTo.Values.ToArray();
var c = new[] {initialGuessM, initialGuessS};
int info;
alglib.lsfitstate state;
alglib.lsfitreport rep;
alglib.lsfitcreatef(x, y, c, 0.0001, out state);
alglib.lsfitsetcond(state, epsf, 0, 0);
alglib.lsfitfit(state, MyFunc, null, p);
alglib.lsfitresults(state, out info, out c, out rep);
/* When you get here, the c[] array should have the optimized values
for m and s, so you'll want to handle accordingly depending on your
needs. I'm not sure if you want out parameters for m and s or an
object that has m and s as properties. */
}
private void MyFunc(double[] c, double[] x, ref double func, object obj)
{
var xPt = x[0];
var m = c[0];
var s = c[1];
var P = (double)obj;
func = P / (1 + Math.Exp((xPt + m) / s));
}
public SomeReturnObject优化(SortedDictionary dataToFitTo、double p、double initialGuessM、double initialGuessS)
{
var x=新的双精度[dataToFitTo.Count,1];
for(int i=0;i
请注意,这只是一个简单的例子。Alglib中有很多内置功能,因此您需要在这里调整问题代码,以满足您的需要,包括边界约束、权重、步长、变量缩放等。从第二个链接中的示例和文档中可以清楚地看到如何做到这一切
还请注意,Alglib对MyFunc的方法签名非常挑剔,因此我将避免在这些输入周围移动或添加更多内容
或者,如果Alglib不能满足您的所有需求,您可以编写自己的Levenberg-Marquardt算法。我每天使用Alglib就是为了这个目的。如果您转到链接并一直向下滚动,您会发现包含多种语言(包括C#)的代码示例的文档,我认为这将对您有很大帮助: 对于你的问题,你应该考虑所有你需要的约束,但是一个简单的例子,得到一个非线性最小二乘拟合你的输入函数和数据将看起来像这样:
public SomeReturnObject Optimize(SortedDictionary<double, double> dataToFitTo, double p, double initialGuessM, double initialGuessS)
{
var x = new double[dataToFitTo.Count,1];
for(int i=0; i < dataToFitTo.Count; i++)
{
x[i, 0] = dataToFitTo.Keys.ElementAt(i);
}
var y = dataToFitTo.Values.ToArray();
var c = new[] {initialGuessM, initialGuessS};
int info;
alglib.lsfitstate state;
alglib.lsfitreport rep;
alglib.lsfitcreatef(x, y, c, 0.0001, out state);
alglib.lsfitsetcond(state, epsf, 0, 0);
alglib.lsfitfit(state, MyFunc, null, p);
alglib.lsfitresults(state, out info, out c, out rep);
/* When you get here, the c[] array should have the optimized values
for m and s, so you'll want to handle accordingly depending on your
needs. I'm not sure if you want out parameters for m and s or an
object that has m and s as properties. */
}
private void MyFunc(double[] c, double[] x, ref double func, object obj)
{
var xPt = x[0];
var m = c[0];
var s = c[1];
var P = (double)obj;
func = P / (1 + Math.Exp((xPt + m) / s));
}
public SomeReturnObject优化(SortedDictionary dataToFitTo、double p、double initialGuessM、double initialGuessS)
{
var x=新的双精度[dataToFitTo.Count,1];
for(int i=0;i
请注意,这只是一个简单的例子。Alglib中有很多内置功能,因此您需要在这里调整问题代码,以满足您的需要,包括边界约束、权重、步长、变量缩放等。从第二个链接中的示例和文档中可以清楚地看到如何做到这一切
还请注意,Alglib对MyFunc的方法签名非常挑剔,因此我将避免在这些输入周围移动或添加更多内容
或者,如果Alglib不能满足您的所有需求,您可以编写自己的Levenberg-Marquardt算法。如果p是一个已知常数,
m
和s
是可变的,您可以将您的双倍列表输入x?您读过了吗?@Sebastian是的,我猜答案就在那里的某个地方,但我无法根据那篇文章实际编写任何代码。试试C#的文档,这里有一些例子可以说明你要做什么:如果P是一个已知常数,m
和s
是变量,你把你的双倍列表输入到x中?你读过了吗?@sebastian是的,我有,我猜答案就在那里的某个地方,但我无法根据那篇文章编写任何代码。请尝试C#文档,这里有一些示例说明您正在尝试做什么:非常感谢您的帮助!如何设置P的值/如何使P成为拟合参数(c[2])?Np!应该很简单-Alglib将假定c[]中的每个元素都是您的拟合参数,objectobj
项是常量(您可以传入一个li