2017-11-04 8 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/Cholesky_decomposition https://en.m.wikipedia.org/wiki/Positive-を使用definite_matrix。エラーメッセージによると、あなたの行列はそうではありません。 – Evk

+0

@Evk馬鹿のように聞こえて申し訳ありませんが、私の行列がmath.netの数値で正確であることを確認するにはどうしたらよいですか? – user3610374

+0

システムに問題がある可能性があります。 'matrixArrayBuy.ConditionNumber()'は何を返しますか? 'MultipleRegression.NormalEquations'の代わりに' MultipleRegression.QR'または 'MultipleRegression.Svd'を使用すると、うまく動作しますか? –

答えて

-1

この問題は、異なる方程式のためにオンザフライでオンに切り替えることで修正され、どちらが正解を返し、この例外をスローしなかったかを確認できます。ここに、私が他の誰かを助けることを願っているこの問題に対する私の解決策があります。

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個より少なくてもかまいません。

関連する問題