使用Math.net数字加权multidim拟合

时间:2017-04-27 08:13:36

标签: mathdotnet

我使用Fit.LinearMultiDim方法将4参数函数拟合到多维数据集(2-dim)。更具体:我符合函数

(x1,x2)=> p1 + p2 * x1 + p3 * x1 * x1 + p4 * x2

FitParameters = Fit.LinearMultiDim(xy, z,
    d => 1.0,         // p0*1.0
    d => d[0],        // p1*x1
    d => d[0] * d[0], // p2*x1^2
    d => d[1]);       // p3*x2

现在我遇到的问题是我还想为xy数据点使用权重。我知道我可以使用Fit.MultiDimWeighted,但在这种情况下,我只有一个线性平面,不能实现用于参数2的平方依赖。

你知道如何将两者结合起来吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在查看Math.Net代码后,我找到了一个将多维拟合与加权数据点相结合的解决方案。希望如果遇到同样的问题,这对某人有帮助。

在我运行的源代码中:

FitParametersModel1 = MyFitFunctionModel1(xy, z, w,
    d => 1.0,           // p0*1.0
    d => d[0],          // p1*x1
    d => d[0] * d[0],   // p2*x1^2
    d => d[1]);         // p3*x2

函数MyFitFunctionModel1看起来像这样:

public double[] MyFitFunctionModel1(double[][] x, double[] y, double[] w, params Func<double[], double>[] functions)
{
    var design = MathNet.Numerics.LinearAlgebra.Matrix<double>.Build.Dense(x.Length, functions.Length, (i, j) => functions[j](x[i]));
    return MathNet.Numerics.LinearRegression.WeightedRegression.Weighted(design, MathNet.Numerics.LinearAlgebra.Vector<double>.Build.Dense(y), MathNet.Numerics.LinearAlgebra.Matrix<double>.Build.Diagonal(w)).ToArray();
}