我正在使用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
等等。
当我使用此数据集调用以下函数时,它会抛出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;
}
所以我的序列矩阵不是“正定义”,但它是什么意思?我应该怎样对待我的数据集以避免它?
我的数学不好!提前致谢
答案 0 :(得分:5)
我认为代码的作者意味着“肯定的”。矩阵必须是正定的,以便用Cholesky分解来计算。形式定义是方阵A当且仅当对于所有向量x:
时,A是正定的x'Ax&gt; 0
所有正定矩阵都是关于对角线和方形对称的,所以一个好的开始就是在测试中只使用方形对称矩阵,看看它是如何工作的。为了绝对确保矩阵是正定的,你可以测试它的所有特征值,看它们是否都是> 0.我不知道JAHMM是否有获取矩阵特征值的方法,但如果有,你可以这样做。
答案 1 :(得分:3)
我不知道那个图书馆, 但我认为你的意思是“肯定的”而不是“积极的定义”。
这就是事情:如果你有一个正常的数字,你可以通过查看符号轻松判断它是否为正(或零)。确定性是将这个想法延伸到矩阵世界中,只是看标志不再起作用,因为有些条目可能是正面的,有些可能是负面的。
有许多不同的明确定义(可以证明是相同的),你可以在这里整齐地列出它们: http://en.wikipedia.org/wiki/Positive-definite_matrix#Characterizations
现在,问题在于当您平均选择行时并不能保证 肯定的。事实上,3x3矩阵将始终是正半定的,从不是正定的 我环顾四周;这里有一些提示如何生成正定矩阵: https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/04LinearAlgebra/posdef/
( rand(n, n) + (n - 1)*eye( n ) )
所以你生成一个n×n矩阵,其中所有条目在0和1之间是随机的, 然后添加单位矩阵乘以n-1,在你的情况下为[2,0,0]; [0,2,0]; ...
希望有所帮助...
P.S。我忘了你的矩阵也必须是对称的,因为你想在它上面做一个cholesky。但这很容易,只需生成如上所述的矩阵A,然后选择B = 1/2 *(A + A.transposed()); 这个矩阵B仍然是正定的,它也是对称的......