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

有帮助吗?

解决方案

  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
    

其他提示

您需要明确<!> quot; random <!>“的定义。您对结果矩阵的约束是什么?您希望系数均匀分布或正态分布吗?您是否希望特征值具有特定分布? (等)

有许多方法可以生成正半定矩阵M,包括:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top