2017-11-04 11 views
0

C#의 Math.Net Numerics 라이브러리에 이상한 문제가 있습니다. 최근까지 (아무 것도 내가 말할 수있는 한 변경되지 않은) 내 코드가 완벽하게 작동했지만 다중 회귀를 계산하려고하는 줄의 제목에서 오류 메시지가 표시됩니다.매트릭스는 양수이어야합니다 (Math.Net C# 라이브러리)

각 목록에는 493 개의 이중 값이 있으므로 누구나 내가이 문제를 해결하기 위해 무엇을 할 수 있는지 알고 있습니까?

Vector<double> vectorArrayBuy = CreateVector.Dense(listMRInfoBuy.ElementAt(0).OutputBuy.ToArray()); 

var matrixArrayBuy = CreateMatrix.DenseOfColumnArrays(listMRInfoBuy.ElementAt(0).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(1).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(2).ListValuesBuy.ToArray(), 
           listMRInfoBuy.ElementAt(3).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(4).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(5).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(6).ListValuesBuy.ToArray(), 
           listMRInfoBuy.ElementAt(7).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(8).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(9).ListValuesBuy.ToArray(), listMRInfoBuy.ElementAt(10).ListValuesBuy.ToArray(), 
           listMRInfoBuy.ElementAt(11).ListValuesBuy.ToArray()); 

var itemsBuy = MultipleRegression.NormalEquations(matrixArrayBuy, vectorArrayBuy); 
+0

NormalEquations는 매트릭스와 hernitian https://en.m.wikipedia.org/wiki/Positive-를 확정적 긍정적되어야하는 촐레 스키 분해를 사용 https://en.m.wikipedia.org/wiki/Cholesky_decomposition definite_matrix. 오류 메시지가 말하는 것처럼 - 매트릭스가 아닙니다. – Evk

+0

@Evk 바보처럼 들리는데 미안하지만, 어떻게하면 내 행렬이 math.net 숫자로 양의 확정적인지 어떻게 확인할 수 있습니까? – user3610374

+0

시스템에 이상이있을 수 있습니다. 'matrixArrayBuy.ConditionNumber()'는 무엇을 반환합니까? 'MultipleRegression.NormalEquations' 대신에'MultipleRegression.QR' 또는'MultipleRegression.Svd'를 사용하면 우연히 작동합니까? –

답변

-1

다른 식에 대한 플라이를 켜서이 문제를 해결하여 어느 답변이 올바른 답변을 반환했는지 그리고이 예외를 throw하지 않았는지 확인합니다. 다음은이 문제에 대한 나의 해결책이다.

public Vector<double> CalculateWithQR(Matrix<double> x, Vector<double> y) 
    { 
     Vector<double> result = null; 

     try 
     { 
      result = MultipleRegression.QR(x, y); 

      // check for NaN and infinity 
      for (int i = 0; i < result.Count; i++) 
      { 
       var value = result.ElementAt(i); 

       if (Double.IsNaN(value) || Double.IsInfinity(value)) 
       { 
        return null; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 

     return result; 
    } 

    public Vector<double> CalculateWithNormal(Matrix<double> x, Vector<double> y) 
    { 
     Vector<double> result = null; 

     try 
     { 
      result = MultipleRegression.NormalEquations(x, y); 

      // check for NaN and infinity 
      for (int i = 0; i < result.Count; i++) 
      { 
       var value = result.ElementAt(i); 

       if (Double.IsNaN(value) || Double.IsInfinity(value)) 
       { 
        return null; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 

     return result; 
    } 

    public Vector<double> CalculateWithSVD(Matrix<double> x, Vector<double> y) 
    { 
     Vector<double> result = null; 

     try 
     { 
      result = MultipleRegression.Svd(x, y); 

      // check for NaN and infinity 
      for (int i = 0; i < result.Count; i++) 
      { 
       var value = result.ElementAt(i); 

       if (Double.IsNaN(value) || Double.IsInfinity(value)) 
       { 
        return null; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 

     return result; 
    } 

    public Vector<double> FindBestMRSolution(Matrix<double> x, Vector<double> y) 
    { 
     Vector<double> result = null; 

     try 
     { 
      result = CalculateWithNormal(x, y); 

      if (result != null) 
      { 
       return result; 
      } 
      else 
      { 
       result = CalculateWithSVD(x, y); 

       if (result != null) 
       { 
        return result; 
       } 
       else 
       { 
        result = CalculateWithQR(x, y); 

        if (result != null) 
        { 
         return result; 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      Console.WriteLine(ex.StackTrace); 
     } 

     return result; 
    } 
+0

이것은 많은 의미를 갖지 않습니다. 당신은이 문제가'NormalEquations'에 의해 제기 된 예외라고 말했습니다. 그렇다면 왜 반환 값을 확인하고 있습니까? 예외가 발생하면 아무 것도 얻을 수 없습니다. 나는 당신이 문제의 바닥에 아직 도달하지 못했다고 생각하며,이 시행 착오 프로그램은 장기적으로 이익을 얻지 못할 것입니다. –

0

는 "매트릭스 명확한 긍정적 없습니다"아마 (당신이 차례로 당신은 아마 당신의 데이터가 어떤 식 으로든 결함이 의미 독립적 인 데이터, N이없는 즉, n 개의 독립적 인 방정식보다 적은 수 있다는 것을 의미들은 예를 들어, 부정확하게 읽혀졌고 실제로는 모두 같거나 비슷한 것입니다.)

질문을 편집하여 현재 작업중인 데이터가 무엇인지 확인할 수 있습니다. 어쩌면 데이터가 n 개 미만일 수도 있습니다.