一种生成正半定矩阵的简单算法

时间:2009-03-06 15:54:11

标签: algorithm math matrix

我想生成正随机半定矩阵。我正在寻找一种算法,或者更优选的是C,matlab,java或任何语言的算法的简单实现。

6 个答案:

答案 0 :(得分:41)

  1. 生成随机矩阵
  2. 乘以它自己的换位
  3. 你已经获得了一个正的半确定矩阵。
  4. 示例代码(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,包括:

  1. 给定任意矩阵A,计算M = A T A(构造Cholesky decomposition
  2. 给定具有非负对角线条目的任意对角矩阵S和相同大小的标准正交矩阵Q,计算M = QSQ T (构造singular value decomposition
  3. 由于数值原因,我可能会选择第二种方法,生成具有所需属性的对角矩阵,然后生成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的随机正态矩阵几乎可以肯定是满秩的;要生成秩不足的矩阵,可以附加一个或多个其他列的线性组合的列。