具有给定特征值和特征向量的随机半正定矩阵
Random positive semi-definite matrix with given eigenvalues and eigenvectors
有没有办法在Python中生成具有给定特征值和特征向量的随机半正定矩阵?
我查看了this,但它们不允许为矩阵构造指定特征值。
上下文: 我想生成椭圆率受控的随机多元高斯分布,因为分布的 major/minor 轴的长度与特征值成正比,我想要我的协方差矩阵拥有它们。 Definiton could be found here (page 81).
当你没有特征向量而只想要一些特征值时,你可以列出你想要的特征值并使用正交矩阵将它们混在一起。由于同余变换不会改变矩阵的惯性(达到数值精度),您可以使用随机矩阵的 QR 分解的 Q 矩阵(或任何其他方式生成正交矩阵)。
import numpy as np
import scipy.linalg as la
des = [1, 0, 3, 4, -2, 0, 0]
n = len(des)
s = np.diag(des)
q, _ = la.qr(np.random.rand(n, n))
semidef = q.T @ s @ q
np.linalg.eigvalsh(semidef)
给予
array([-2.00000000e+00, -2.99629568e-16, -5.50063275e-18, 2.16993906e-16,
1.00000000e+00, 3.00000000e+00, 4.00000000e+00])
当你实际上也有特征向量时,你可以简单地构造原始矩阵,这就是特征值分解的定义。
有没有办法在Python中生成具有给定特征值和特征向量的随机半正定矩阵?
我查看了this,但它们不允许为矩阵构造指定特征值。
上下文: 我想生成椭圆率受控的随机多元高斯分布,因为分布的 major/minor 轴的长度与特征值成正比,我想要我的协方差矩阵拥有它们。 Definiton could be found here (page 81).
当你没有特征向量而只想要一些特征值时,你可以列出你想要的特征值并使用正交矩阵将它们混在一起。由于同余变换不会改变矩阵的惯性(达到数值精度),您可以使用随机矩阵的 QR 分解的 Q 矩阵(或任何其他方式生成正交矩阵)。
import numpy as np
import scipy.linalg as la
des = [1, 0, 3, 4, -2, 0, 0]
n = len(des)
s = np.diag(des)
q, _ = la.qr(np.random.rand(n, n))
semidef = q.T @ s @ q
np.linalg.eigvalsh(semidef)
给予
array([-2.00000000e+00, -2.99629568e-16, -5.50063275e-18, 2.16993906e-16,
1.00000000e+00, 3.00000000e+00, 4.00000000e+00])
当你实际上也有特征向量时,你可以简单地构造原始矩阵,这就是特征值分解的定义。