Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我的矩阵是“非正定”时有什么问题?_Java_Math_Matrix - Fatal编程技术网

Java 当我的矩阵是“非正定”时有什么问题?

Java 当我的矩阵是“非正定”时有什么问题?,java,math,matrix,Java,Math,Matrix,我正在使用Jahmm java库进行分类。我想做一些测试,所以我生成一些随机数据集 我以以下格式创建数据集: [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 及 等等 当我用这个数据集调用下面的函数时,它抛出一个IllegalArgumentException static doub

我正在使用Jahmm java库进行分类。我想做一些测试,所以我生成一些随机数据集

我以以下格式创建数据集:

[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

等等

当我用这个数据集调用下面的函数时,它抛出一个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;
}
所以我的序列矩阵不是正定义的,但它意味着什么?应该如何处理我的数据集以避免它


我数学不好!提前谢谢

我想代码的作者的意思是肯定的。矩阵必须是正定的,才能用Cholesky分解分解。形式定义为方阵a是正定的当且仅当,对于所有向量x:

x'Ax>0


所有正定矩阵都是关于对角线和平方的对称矩阵,所以在测试中只使用平方对称矩阵是一个好的开始,看看它是如何工作的。为了绝对确保矩阵是正定的,您可以测试它的所有特征值,看看它们是否都>0。我不知道JAHMM是否有获取矩阵特征值的方法,但如果有,你可以这样做

我不知道那个图书馆, 但我想你的意思是肯定的,不是肯定的

事情是这样的:如果你有一个正常的数字,你可以通过看符号很容易地判断它是正的还是负的还是零的。确定性是这一思想在矩阵世界中的延伸,在矩阵世界中,仅仅看符号不再有效,因为有些条目可能是正的,有些条目可能是负的

定义有许多不同的定义,它们可以被证明是相等的,你可以在这里找到它们:

现在的问题是,当您平均选择行时,这并不能保证 肯定性。事实上,3x3矩阵总是半正定的,永远不会是正定的。 我环顾了一下周围;下面是一些如何生成正定矩阵的提示:

randn,n+n-1*眼睛n

生成一个nxn矩阵,其中所有条目都是0到1之间的随机项, 然后将单位矩阵与n-1相乘,即[2,0,0];[0,2,0];...

希望这有助于

p、 我忘了你们的矩阵也必须是对称的,因为你们想在上面做一个cholesky。但这很简单,只需生成上面提到的矩阵A,然后选择B=1/2*A+A;
这个矩阵B仍然是正定的,它也是对称的:

不相关,但如果你有空闲时间,学习线性代数,它会为你服务,而且正定的标量到矩阵类比描述有趣+1,对于生成正定矩阵的实用建议,我确实在互联网上找到了很多用数学术语解释这一点的文章,正如我所说,我不擅长这一点,不管是愿意还是不愿意,我都不知道;你的解释是第一个简单的英语+解决方案。竖起大拇指!
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;
}