連立方程式の数が1000(3つまたは4つの異なる入力)になる可能性があるC#で重回帰を実行する効率的な方法を知っている人はいますか?重回帰に関するこの記事を読んだ後、行列方程式を使用して実装してみました。
Matrix y = new Matrix(
new double[,]{{745},
{895},
{442},
{440},
{1598}});
Matrix x = new Matrix(
new double[,]{{1, 36, 66},
{1, 37, 68},
{1, 47, 64},
{1, 32, 53},
{1, 1, 101}});
Matrix b = (x.Transpose() * x).Inverse() * x.Transpose() * y;
for (int i = 0; i < b.Rows; i++)
{
Trace.WriteLine("INFO: " + b[i, 0].ToDouble());
}
ただし、行列の反転操作のため、数千の方程式のスケールにうまくスケーリングできません。R言語を呼び出してそれを使用することはできますが、これらの大規模なセットに拡張できる純粋な.Netソリューションがあることを期待していました。
助言がありますか?
編集#1:
とりあえずRを使って解決しました。statconn(ここからダウンロード)を使用することにより、この方法を使用するのが高速で比較的簡単であることがわかりました。つまり、ここに小さなコードスニペットがあります。これは、R statconnライブラリを使用するためのコードではありません(注:これがすべてのコードではありません!)。
_StatConn.EvaluateNoReturn(string.Format("output <- lm({0})", equation));
object intercept = _StatConn.Evaluate("coefficients(output)['(Intercept)']");
parameters[0] = (double)intercept;
for (int i = 0; i < xColCount; i++)
{
object parameter = _StatConn.Evaluate(string.Format("coefficients(output)['x{0}']", i));
parameters[i + 1] = (double)parameter;
}