Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Math.NET Numerics中的线性回归代码可以更快吗?_C#_Regression_Math.net_Mathnet Numerics - Fatal编程技术网

C#Math.NET Numerics中的线性回归代码可以更快吗?

C#Math.NET Numerics中的线性回归代码可以更快吗?,c#,regression,math.net,mathnet-numerics,C#,Regression,Math.net,Mathnet Numerics,我需要有效地进行多元线性回归。我正在尝试使用Math.NET Numerics软件包,但它似乎很慢-也许是我编写的方式?对于这个例子,我只有简单的(1 x值)回归 我有一段话: public class barData { public double[] Xs; public double Mid; public double Value; } public

我需要有效地进行多元线性回归。我正在尝试使用Math.NET Numerics软件包,但它似乎很慢-也许是我编写的方式?对于这个例子,我只有简单的(1 x值)回归

我有一段话:

        public class barData
        {
            public double[] Xs;
            public double Mid;
            public double Value;

        }

        public List<barData> B;


        var xdata = B.Select(x=>x.Xs[0]).ToArray();
        var ydata = B.Select(x => x.Mid).ToArray();

        var X = DenseMatrix.CreateFromColumns(new[] { new DenseVector(xdata.Length, 1), new DenseVector(xdata) });
        var y = new DenseVector(ydata);

        var p = X.QR().Solve(y);
        var b = p[0];
        var a = p[1];
        B[0].Value = (a * (B[0].Xs[0])) + b;

另外,如果Math.NET是一个问题,那么如果有人知道将我的纯代码更改为多个X的简单方法,我将非常感谢您的帮助

使用QR分解是一种非常通用的方法,它可以为任何具有线性参数的函数提供最小二乘回归解,无论它有多么复杂。因此,它不能与非常具体的直接实现(在计算时间上)竞争并不奇怪,特别是在
y:x->a+b*x
的简单情况下。不幸的是,Math.NET Numerics不提供直接回归例程,但您可以使用它

但是,为了提高速度,您仍然可以尝试以下几点:

  • 使用精简而不是完全QR分解,即将
    QRMethod.thin
    传递到
    QR
    方法
  • 使用我们的(更快的QR,但不再是纯粹的托管代码)
  • 调整线程,例如尝试完全禁用多线程(
    Control.ConfigureSingleThread()
    )或调整其参数

如果数据集非常大,也有更有效的方法来构建矩阵,但这可能与QR(->性能分析!)无关。

您确定了在任何调试器之外运行发布构建的时间吗?缓慢的部分是什么<代码>变量p=X.QR().Solve(y)?
       double xAvg = 0;
        double yAvg = 0;

        int n = -1;
        for (int x = Length - 1; x >= 0; x--)
        {
            n++;
            xAvg += B[x].Xs[0];
            yAvg += B[x].Mid;
        }

        xAvg = xAvg / B.Count;
        yAvg = yAvg / B.Count;

        double v1 = 0;
        double v2 = 0;

        n = -1;
        for (int x = Length - 1; x >= 0; x--)
        {
            n++;
            v1 += (B[x].Xs[0] - xAvg) * (B[x].Mid - yAvg);
            v2 += (B[x].Xs[0] - xAvg) * (B[x].Xs[0] - xAvg);
        }

        double a = v1 / v2;
        double b = yAvg - a * xAvg;

        B[0].Value = (a * B[Length - 1].Xs[0]) + b;