题
我想生成正随机半定矩阵。我正在寻找一种算法,或者更优选的是C,matlab,java或任何语言的算法的简单实现。
解决方案
- 生成随机矩阵
- 乘以它自己的换位
- 你已经获得了一个正的半确定矩阵。 醇>
示例代码(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
其他提示
您需要明确<!> quot; random <!>“的定义。您对结果矩阵的约束是什么?您希望系数均匀分布或正态分布吗?您是否希望特征值具有特定分布? (等)
有许多方法可以生成正半定矩阵M,包括:
- 给定任意矩阵A,计算M = A T A(构建 Cholesky分解)
- 给定具有非负对角线条目的任意对角矩阵S和相同大小的标准正交矩阵Q,计算M = QSQ T (构造奇异值分解) 醇>
由于数值原因,我可能会选择第二种方法,生成具有所需属性的对角矩阵,然后生成Q作为多个 Householder反射(生成随机向量v,缩放到单位长度,H = I - 2vv T );我怀疑你想要使用K * N,其中N是矩阵M的大小,而K是1.5-3之间的数字(我猜这个)确保它有足够的自由度。
您还可以使用 Givens旋转生成标准正交矩阵Q:从1中选择2个不同的值到N并产生围绕这对轴的Givens旋转,角度从0到2 * pi均匀分布。然后取这些K * N(与上段相同的推理),它们的组成产生Q.
编辑:我猜测(不确定)如果你有独立生成和正态分布的系数,那么矩阵作为一个整体将是<!>正常分布的< !> QUOT; (不管它是什么意思)。至少对于矢量来说这是真的。 (N个独立生成的高斯随机变量,每个分量一个,给出高斯随机向量)对于均匀分布的分量,情况并非如此。
如果您可以使用所选语言生成随机矩阵,那么通过使用矩阵乘以其转置的属性为正半定义,您可以生成随机正半正定矩阵
在Matlab中,它就像
一样简单% Generate a random 3x3 matrix
A = rand(3,3)
% Multiply by its tranpose
PosSemDef = A'*A
关于半正定矩阵的自然分布是 Wishart发行版。
A'* A将给出一个正半精子矩阵iff,并且只有当A是缺乏秩时。所以上面提到的答案以及从维基百科中复制的答案通常都不正确。为了计算正半定矩阵,只需采用矩形m乘n矩阵(m <!> n;)并将其乘以其转置。即如果B是m×n矩阵,则m <!> lt; n,则B'* B是半定矩阵。我希望这会有所帮助。
澄清一点(我希望)。设A是随机矩阵(例如,由随机正规变量填充),m x n,其中m <!> gt; = n。然后如果A是完整的列级别,A'A将是肯定的。如果A的等级为<!> lt;那么A'A将是半正的(但不是 肯定的。)
m <!> gt; = n的随机正规矩阵几乎肯定是满秩的;为了生成秩不足的矩阵,可以附加一个或多个列,这些列是其他列的线性组合。