2014-04-17 161 views
0

我想在C#中進行多元線性迴歸。我試圖用MathNet.Numerics來實現這一點,但我一直收到錯誤「矩陣尺寸必須達到2x3」。C多元線性迴歸#

/***************************************************** 
    * MathNet.Numerics Multiple linear regression test * 
    ****************************************************/ 

var ydata = new double[] { 15, 20, 25, 55, 95 }; 
var xdata = new[] { new[] { 1.0, 4.0 }, new[] { 2.0, 5.0 }, new[] { 3.0, 6.0 } }; 

var x = DenseMatrix.OfColumns(2, 3, xdata); 
var y = new DenseVector(ydata); 

var p = x.QR().Solve(y); // error: matrix dimensions must agree 2x3 
var a = p[0]; 
var b = p[1]; 

MessageBox.Show(a.ToString(), "Test"); 
MessageBox.Show(b.ToString(), "Test"); 
+0

嗯...... ydata中的5個值與xdata中的6(2x3)值不匹配? – BlackjacketMack

回答

1

在這種情況下,異常文本真的很糟糕,我們應該解決這個問題。

有兩種導致此失敗具體問題:

  • 具有3個未知數,但只有2等式/樣品(2×3矩陣)系統定義下;將回歸應用於這樣的問題實際上沒有任何意義,因爲有無數精確的解決方案。

  • 對於這兩個樣品/方程右手y側實際上有5個值(而不是2,向每個樣品匹配)

也許更容易開始與新Fit類,可以在V3。例如,讓我們做下面的示例一個普通的迴歸:

a b   y 
1.0, 4.0 --> 15.0 
2.0, 5.0 --> 20.0 
3.0, 2.0 --> 10.0 

有了問題找U,V和W,最大限度地減少在

y ~= u + a*v + b*w 

這些樣本誤差飛度類此看起來像下面這樣:

double[] p = Fit.MultiDim(
    new[] {new[] { 1.0, 4.0 }, new[] { 2.0, 5.0 }, new[] { 3.0, 2.0 }}, 
    new[] { 15.0, 20, 10 }, 
    intercept: true); 
// p = [u,v,w] = [-1.25,1.25,3.75], hence y ~= -1.25 + 1.25*a + 3.75*b 

隨着線性代數和矩陣分解情況也可能是這樣的:

var A = DenseMatrix.OfArray(new[,] { 
      { 1.0, 1.0, 4.0 }, 
      { 1.0, 2.0, 5.0 }, 
      { 1.0, 3.0, 2.0 }}); 
var b = new DenseVector(new[] { 15.0, 20, 10 }); 
var p2 = A.Solve(b); 
// p = [-1.25,1.25,3.75] 

這有幫助嗎?

+0

完美。謝謝。有一個小錯字:「A.QR()。解決(b);」對?它以這種方式工作。 –

+1

在v2上,您需要明確選擇QR分解,是的。在v3中有一個新的Matrix.Solve方法可以自動選擇一個 - 在這種情況下,它會選擇更快的LU分解,因爲矩陣是正方形的。 –