2

多重線形回帰を効率的に行う必要があります。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;

これは、この純粋な C# よりも約 20 倍遅く実行されます。

       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;

また、Math.NET が問題の場合は、複数の X の純粋なコードを変更する簡単な方法を誰かが知っていれば、助けていただければ幸いです。

4

1 に答える 1