将随机矩阵变为半正定
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.mm
或torch.matmul
。
【讨论】:
以上是关于将随机矩阵变为半正定的主要内容,如果未能解决你的问题,请参考以下文章