2014-04-17 4 views
0

C#에서 다중 회귀 분석을 만들고 싶습니다. MathNet.Numerics에서이 작업을 수행하려고합니다. 그러나 "Matrix dimensions가 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

흠 ... xdata에서 6 (2x3) 값이있는 ydata의 5 개 값이 일치하지 않습니까? – BlackjacketMack

답변

1

이 경우 예외 텍스트가 실제로 잘못되었으므로 수정해야합니다.

이 실패하는 원인 개의 구체적인 문제가있다 :

  • 정의하에 -3- 알려지지 만 2 방정식/샘플 (2 × 3 행렬)로 시스템이고; 그러한 문제에 대한 회귀를 적용하는 것은 무한한 수의 정확한 해가 존재하기 때문에 실제로는 의미가 없습니다. 두 샘플,

  • 은/우측 y를

어쩌면이 가능한 새로운 Fit 클래스 시작하기 쉽다 (각 샘플 일치 대신 2) 실제로 5 개 값이 방정식 v3. 예를 들어, 다음과 같은 샘플 일반 회귀하자 : U, V를 찾는 문제로

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

를하고 승 맞춤 클래스로

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(). Solve (b);" 권리? 그런 식으로 일했습니다. –

+1

v2에서 명시 적으로 QR 분해를 선택해야합니다 (예). v3에는 자동으로 하나를 선택하는 새로운 Matrix.Solve 메서드가 있습니다.이 경우 매트릭스가 정사각형이므로 더 빠른 LU 분해를 선택했을 것입니다. –