2012-04-12 12 views
-1

私は分類のためにJahmm java libを使用しています。私はいくつかのランダムなデータセットを生成するようにいくつかのテストをしたいです。私のマトリックスが「明確ではない」と間違っていますか?

私はこの形式でデータセットを作成します。

[val_1.1 val_1.2 val_1.3];[val_2.1 val_2.2 val_2.3]; [val_3.1 val_3.2 val_3.3] etc... 

val_1.1 == val_1.2 == val_1.3 

val_2.1 == val_2.2 == val_2.3 

ことなど私はランダム関数を使用します。

私はこのデータセットでは、次の関数を呼び出すと、それは

static double[][] decomposeCholesky(double[][] m) 
{ 
    if (!isSquare(m)) 
     throw new IllegalArgumentException("Matrix is not square"); 

    double[][] l = matrix(nbRows(m), nbColumns(m)); 

    for (int j = 0; j < nbRows(m); j++) 
    { 
     double[] lj = l[j]; 
     double d = 0.; 

     for (int k = 0; k < j; k++) { 
      double[] lk = l[k]; 
      double s = 0.; 

      for (int i = 0; i < k; i++) 
       s += lk[i] * lj[i]; 

      lj[k] = s = (m[j][k] - s)/l[k][k]; 
      d = d + s * s; 
     } 

     if ((d = m[j][j] - d) <= 0.) 
      throw new IllegalArgumentException("Matrix is not positive " + 
      "defined"); 

     l[j][j] = Math.sqrt(d); 
     for (int k = j+1; k < nbRows(m); k++) 
      l[j][k] = 0.; 
    } 

    return l; 
} 

はIllegalArgumentException

をスローしますので、私のシーケンス・マトリックスは、「正定義された」ではありませんが、それは何を意味するのでしょうか?それを避けるために私のデータセットに何をすべきですか?

私は数学では良くありません!事前に感謝

+6

http://en.wikipedia.org/wiki/Positive-definite_matrix – Luciano

+2

自由時間がある場合は線形代数、それはあなたに役立つだろう、それは "正義のスカラーから行列への類推の説明のための"楽しい " – Luciano

答えて

3

私はそのライブラリ、 を知らないが、私はあなたが "正定"ではない "正の定義"を意味すると思います。

ここには何かがあります:普通の数字があれば、その記号を見ることでプラスかプラスかを簡単に知ることができます。明確さは、そのアイデアをマトリックスの世界に拡張したものであり、いくつかのエントリーが陽性であり、あるものが陰性である可能性があるため、単にサインを見ることはもはや機能しません。

(同等であることが証明できる)定性のさまざまな定義がありますが、あなたがそれらをきれいにここに記載されています: http://en.wikipedia.org/wiki/Positive-definite_matrix#Characterizations

今、問題はあなたの行を選択した場合も同様にないということです保証 正の確定性。実際には、3x3行列は常に正の半定値で決して正定値ではありません。
少し見てきました。ここでは正定値行列を生成する方法をいくつかのヒントです: ので、あなたは、すべてのエントリは、0と1の間のランダムなanxn行列を生成 https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/04LinearAlgebra/posdef/

(rand(n, n) + (n - 1)*eye(n))

をその後、単位行列を追加し、N-1と乗算あなたのケースでは[2,0,0]; [0,2,0]; ...

あなたが助けてくれる希望...


p.s.私はあなたの行列が対称でなければならないことを忘れていました。なぜなら、あなたはそれにコレスキーをしたいからです。しかし簡単ですが、上記のように行列Aを生成し、次にB = 1/2 *(A + A.transposed())を選択します。 この行列Bは依然として正定値であり、対称でもあります。

+0

+1であり、正定値行列を生成するための実際的な提案である。 –

+0

私はインターネット上で多くの記事を数学的に説明していましたが、私はそれがうまくいかないと言っていました。いいぞ! – jorrebor

5

私はコードの作成者は "正定を意味したと思います。コレスキー分解を考慮に入れるには、行列を正定値にする必要があります。正式な定義は、正方行列Aは、すべてのベクトルxについて、場合に限り、正定値である:

x'Ax> 0

すべての正定値行列が対角、および、正方形、とても良いについて対称でありますテストでは正方形の対称行列のみを使用し、それがどのように動作するか見ることができます。行列が正定値であることを確実にするために、すべての固有値をテストして、それぞれが0より大きいかどうかを調べることができます.JAHMMが行列の固有値をとる方法を持っているかどうかは分かりませんが、

関連する問題