将随机矩阵变为半正定

Posted

技术标签:

【中文标题】将随机矩阵变为半正定【英文标题】:turn random matrices to positive semidefinite 【发布时间】:2021-01-03 00:08:34 【问题描述】:

当我生成随机矩阵并将它们变成半正定矩阵时,我遇到了问题。如果我们取一个随机矩阵 Q,然后将其乘以它的转置,那么结果应该是半正定的(没有负特征值)但是当我打印一些随机特征值时,我看到我有负值。我的代码有问题吗?我还想将特征值的最大值保存到向量中。我的 Q 随机矩阵是整数,我看到的特征值是实数,复数部分始终为 0。但是我也收到警告。让我先给你看我的代码

#here i create a random torch with N matrices of n by n size
Q = torch.randint(0, 10, size=(N, n, n))

#here i initialize my vector for the max eigenvalues
max=np.zeros(N)

#here i create a loop where i multiply each Q matrix in my torch with its transpose
for i in range(0,N):
    Q[i] = Q[i]*Q[i].t()
    #here i find my eigenvalues and save the max into my vector max
    val,vec=lg.eig(Q[i])
    max[i]= np.amax(val)

我得到的警告是

ComplexWarning: Casting complex values to real discards the imaginary part

我的特征值我用命令从控制台打印出来

lg.eig(Q[0])
However i see for example
(array([120.20198423+0.j,  -1.93985888+0.j,  34.73787466+0.j])

Which has a negative value

【问题讨论】:

好的,所以我不知道torch,但是通过阅读您的代码,我想说问题可能是您转置矩阵,而不是共轭转置,因为那里有复杂的值。这也可以解释为什么您会收到与复杂值相关的警告。警告来自哪一行? Q[i]*Q[i].t() 是执行矩阵乘法还是元素乘积? IIRC,在 numpy 中我们需要使用 @ 来做矩阵乘法 嘿,你是对的。当我使用@时,我不再有负值!关于现在的警告,我用命令 max[i]= np.amax(val) 【参考方案1】:

您的示例是一个随机整数矩阵,但您的警告消息暗示 Q 包含复数值。

因此,为了创建一个半正定矩阵,您必须将Q 乘以其共轭转置torch.conj(Q).t()(这相当于跨实数的转置)。

此外,您正在使用* 计算点积,对于矩阵乘法使用@torch.mmtorch.matmul

【讨论】:

以上是关于将随机矩阵变为半正定的主要内容,如果未能解决你的问题,请参考以下文章

正定矩阵和半正定矩阵

半正定矩阵

如何理解正定矩阵和半正定矩阵

matlab 判断矩阵是正定半正定还是负定

matlab 判断矩阵是正定半正定还是负定

MIMO中矩阵的小笔记(正定,半正定)