我想生成正随机半定矩阵。我正在寻找一种算法,或者更优选的是C,matlab,java或任何语言的算法的简单实现。
答案 0 :(得分:41)
示例代码(Python):
from scipy import random, linalg
matrixSize = 10
A = random.rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())
print 'random positive semi-define matrix for today is', B
答案 1 :(得分:18)
您需要明确“随机”的定义。您对结果矩阵的约束是什么?您希望系数均匀分布或正态分布吗?您是否希望特征值具有特定分布? (等)
有许多方法可以生成正半定矩阵M,包括:
由于数值原因,我可能会选择第二种方法,生成具有所需属性的对角矩阵,然后生成Q作为多个Householder reflections的组合(生成随机向量v,缩放到单位长度, H = I - 2vv T );我怀疑你想要使用K * N,其中N是矩阵M的大小,而K是1.5-3之间的数字(我猜这个)确保它有足够的自由度。
您还可以使用Givens rotations生成正交矩阵Q:从1到N中选择2个不同的值,并围绕该对轴生成Givens旋转,角度从0到2 * pi均匀分布。然后取这些K * N(与上段相同的推理),它们的组成产生Q.
编辑:我猜测(不确定)如果你有独立生成和正态分布的系数,那么矩阵作为一个整体将是“正态分布”(无论那意味着什么) )。至少对于矢量来说这是真的。 (N个独立生成的高斯随机变量,每个分量一个,给出高斯随机向量)对于均匀分布的分量,情况并非如此。
答案 2 :(得分:8)
如果您可以使用所选语言生成随机矩阵,那么通过使用矩阵乘以其转置的属性为正半定义,您可以生成随机正半正定矩阵
在Matlab中,它就像
一样简单% Generate a random 3x3 matrix
A = rand(3,3)
% Multiply by its tranpose
PosSemDef = A'*A
答案 3 :(得分:6)
正半定矩阵的自然分布为Wishart distributions。
答案 4 :(得分:2)
A'* A将给出一个正半精子矩阵iff,并且只有当A是缺乏秩时。所以上面提到的答案以及从维基百科中复制的答案通常都不正确。为了计算正半定矩阵,简单地取任何矩形m乘n矩阵(m
答案 5 :(得分:0)
澄清一下(我希望)。设A为一个随机矩阵(例如,由随机正态变量填充),m x n,其中m> = n。然后,如果A具有完整的列秩,则A'A将为正定。如果A的等级 一个m> = n的随机正态矩阵几乎可以肯定是满秩的;要生成秩不足的矩阵,可以附加一个或多个其他列的线性组合的列。