39

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

4

6 回答 6

72
  1. 生成随机矩阵
  2. 乘以它自己的转置
  3. 你得到了一个半正定矩阵。

示例代码(Python):

import numpy as np
matrixSize = 10 
A = np.random.rand(matrixSize, matrixSize)
B = np.dot(A, A.transpose())
print 'random positive semi-define matrix for today is', B
于 2009-03-06T16:19:16.607 回答
22

你需要清楚你对“随机”的定义。你对结果矩阵有什么限制?您希望系数均匀分布还是正态分布?您是否希望特征值具有特定分布?(ETC。)

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

  1. 给定任意矩阵 A,计算 M = A T A(构造Cholesky 分解
  2. 给定具有非负对角元素的任意对角矩阵 S 和相同大小的正交矩阵 Q,计算 M = QSQ T(构造奇异值分解

出于数字原因,我可能会选择第二种方法,通过生成具有所需属性的对角矩阵,然后生成 Q 作为多个Householder 反射的组合(生成随机向量 v,缩放到单位长度,H = I - 2vv T ); 我怀疑你想使用 K * N 其中 N 是矩阵 M 的大小,而 K 是 1.5-3 之间的一个数字(我猜这个),以确保它具有足够的自由度。

您还可以使用Givens 旋转生成一个正交矩阵 Q :从 1 到 N 中选择 2 个不同的值,并围绕该对轴生成一个 Givens 旋转,角度从 0 到 2 * pi 均匀分布。然后取其中的 K * N 个(与上段相同的推理),它们的组合产生 Q。

编辑:我(不确定)如果您有独立生成且正态分布的系数,那么整个矩阵将是“正态分布”(无论这意味着什么)。至少对于向量来说是这样。(N 个独立生成的高斯随机变量,每个分量一个,为您提供一个高斯随机向量)对于均匀分布的分量,情况并非如此。

于 2009-03-06T17:58:31.330 回答
10

如果您可以用您选择的语言生成一个随机矩阵,那么通过使用矩阵乘以其转置为半正定的性质,您可以生成一个随机半正定矩阵

在 Matlab 中,它就像

% Generate a random 3x3 matrix
    A = rand(3,3) 
% Multiply by its tranpose
    PosSemDef = A'*A 
于 2009-03-06T16:22:39.767 回答
6

半正定矩阵上的自然分布是Wishart 分布

于 2010-07-02T10:52:17.987 回答
4

A'*A 将给出一个正半定矩阵当且仅当 A 秩亏时。因此,上述答案以及从维基百科复制的答案通常并不正确。要计算一个半正定矩阵,只需将任何矩形 m × n 矩阵 (m < n) 乘以它的转置。即如果 B 是一个 m × n 矩阵,其中 m < n,那么 B'*B 是一个半定矩阵。我希望这有帮助。

于 2011-09-21T14:49:15.290 回答
2

澄清一点(我希望)。令 A 为随机矩阵(例如,由随机正态变量填充),mxn 且 m >= n。那么如果 A 是满列秩,A'A 将是正定的。如果 A 的秩 < n 则 A'A 将是半正定的(但不是正定的)。

m >= n 的随机正态矩阵几乎肯定是满秩的;要生成秩亏矩阵,可以附加一列或多列,这些列是其他列的线性组合。

于 2018-09-22T16:15:28.727 回答