我想生成正随机半定矩阵。我正在寻找一种算法,或者最好是用 C、matlab、java 或任何语言实现该算法的简单实现。
6 回答
- 生成随机矩阵
- 乘以它自己的转置
- 你得到了一个半正定矩阵。
示例代码(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
你需要清楚你对“随机”的定义。你对结果矩阵有什么限制?您希望系数均匀分布还是正态分布?您是否希望特征值具有特定分布?(ETC。)
有多种方法可以生成半正定矩阵 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 到 N 中选择 2 个不同的值,并围绕该对轴生成一个 Givens 旋转,角度从 0 到 2 * pi 均匀分布。然后取其中的 K * N 个(与上段相同的推理),它们的组合产生 Q。
编辑:我猜(不确定)如果您有独立生成且正态分布的系数,那么整个矩阵将是“正态分布”(无论这意味着什么)。至少对于向量来说是这样。(N 个独立生成的高斯随机变量,每个分量一个,为您提供一个高斯随机向量)对于均匀分布的分量,情况并非如此。
如果您可以用您选择的语言生成一个随机矩阵,那么通过使用矩阵乘以其转置为半正定的性质,您可以生成一个随机半正定矩阵
在 Matlab 中,它就像
% Generate a random 3x3 matrix
A = rand(3,3)
% Multiply by its tranpose
PosSemDef = A'*A
半正定矩阵上的自然分布是Wishart 分布。
A'*A 将给出一个正半定矩阵当且仅当 A 秩亏时。因此,上述答案以及从维基百科复制的答案通常并不正确。要计算一个半正定矩阵,只需将任何矩形 m × n 矩阵 (m < n) 乘以它的转置。即如果 B 是一个 m × n 矩阵,其中 m < n,那么 B'*B 是一个半定矩阵。我希望这有帮助。
澄清一点(我希望)。令 A 为随机矩阵(例如,由随机正态变量填充),mxn 且 m >= n。那么如果 A 是满列秩,A'A 将是正定的。如果 A 的秩 < n 则 A'A 将是半正定的(但不是正定的)。
m >= n 的随机正态矩阵几乎肯定是满秩的;要生成秩亏矩阵,可以附加一列或多列,这些列是其他列的线性组合。