-1

分類にJahmmjavalibを使用しています。いくつかのテストを行いたいので、ランダムなデータセットを生成します。

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

[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 

等々。

このデータセットで次の関数を呼び出すと、IllegalArgumentExceptionがスローされます

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;
}

だから私のシーケンスマトリックスは「ポジティブ定義」ではありませんが、それはどういう意味ですか?そして、それを回避するために私のデータセットに何をすべきですか?

私は数学が苦手です!前もって感謝します

4

2 に答える 2

5

コードの作者は「ポジティブデフィント」を意味していると思います。コレスキー分解で因数分解するには、行列が正定値である必要があります。正式な定義は正方行列です。すべてのベクトルxについて、次の場合に限り、Aは正方行列です。

x'Ax> 0

すべての正定行列は対角線と正方形に関して対称であるため、テストでは正方形の対称行列のみを使用して、それがどのように機能するかを確認することをお勧めします。行列が正定値であることを完全に確認するには、すべての固有値をテストして、それぞれが0より大きいかどうかを確認します。JAHMMに行列の固有値を取得する方法があるかどうかはわかりませんが、そうであれば、それを行うことができます。

于 2012-04-12T16:12:15.707 に答える
3

私はそのライブラリを知りませんが、あなたは「ポジティブ定義」ではなく「ポジティブ明確」を意味すると思います。

これが重要です。正規数がある場合は、符号を見れば、それが正か負(またはゼロ)かを簡単に判断できます。明確性は、そのアイデアを行列の世界に拡張したものです。ここでは、正のエントリと負のエントリがあるため、符号を見るだけでは機能しなくなります。

明確性にはさまざまな定義があり(等しいことが証明できます)、ここにきちんとリストされています:http: //en.wikipedia.org/wiki/Positive-definite_matrix#Characteristics

ここで問題となるのは、行を均等に選択した場合、正定性が保証されないことです。実際、3x3行列は常に正の半確定であり、正の確定になることはありません。
私は少し見回しました。正定値行列を生成する方法のヒントを次に示し ます。https ://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/04LinearAlgebra/posdef/

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

したがって、すべてのエントリが0から1の間でランダムである、anxn行列を生成し、次にn-1を掛けた単位行列を追加します。この場合は[2,0,0];[0,2,0];..です。

それが役立つことを願っています...


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

于 2012-04-12T16:37:17.447 に答える