Java 当我的矩阵是“非正定”时有什么问题?
我正在使用Jahmm 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
[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;
}