gpt4 book ai didi

C# 可以使来自 Math.NET Numerics 的 LinearRegression 代码更快吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:17 25 4
gpt4 key购买 nike

我需要高效地进行多元线性回归。我正在尝试使用 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 更改我的纯代码的简单方法,我将不胜感激一些帮助

最佳答案

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

但是,您仍然可以尝试一些方法来提高速度:

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

如果数据集非常大,还有更有效的方法来构建矩阵,但除了 QR(-> 性能分析!)之外,这可能不是很相关。

关于C# 可以使来自 Math.NET Numerics 的 LinearRegression 代码更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16494851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com