这里不需要使用 Schur 补码,因为A和S已经是对称的。这个问题作为 SDP 的传统表述是
mint subject toA−S+tI⪰0A−S−tI⪯0
产生形式的 SDP(我在这里特别说明,因为 SDP 有很多不同的“标准形式”)
mincTxF0+x1F1+...+xmFm⪰0
在哪里
x=[tS1,1S1,2S1,3…Sn,n]T
有元素,矩阵的大小。 1+n(n−1)/2Fi2n×2n
对于的问题,这意味着您有大约 125,000 个变量和大小为 x的矩阵。原始对偶内点方法(在 SDPA、SDPT3、SeDuMi、CSDP 等中实现)需要在每次迭代中求解一个包含 125,000 个变量的 125,000 个方程的系统,并且该系统通常是完全密集的。 n=500xj10001000
这不是您可以在典型的台式机上执行的操作,但在具有足够 RAM(超过 128 GB)的更强大的服务器上可以实现。解决方案时间会相当长(10 多个小时)
Julia 实现的“分裂锥求解器”在我看来是一阶 ADMM 方法的实现,例如在
B. O'Donoghue、E. Chu、N. Parikh 和 S. Boyd。通过同质自对偶嵌入进行圆锥优化的算子分裂。
用于 SDP 的 ADMM 的问题在于它不能产生非常准确的解决方案(您通常最多只能获得两位或三位数的准确度),并且该方法需要大量调整才能获得良好的结果。它不像原始对偶内点方法那么健壮(从某种意义上说,它可以始终如一地解决您提出的所有问题)。
我不能保证这种方法在 Julia 中的具体实现,因为我从未使用过它。SDP 的其他一阶代码可能比 SCSSolver 做得更好。
凸优化文献中可能有一些关于这种谱范数最小化的工作,它甚至可以避免制定 SDP,但我不是该主题的专家。
您确定您真的需要矩阵 2 范数意义上的最佳近似值,而不是 Frobenius 范数吗?
稍后添加的注释:事实证明,在 Frobenius 范数中计算此投影的方法同样适用于计算谱范数中的投影。的正交对角化为 A
A=∑ni=1λiu(i)u(i)T
然后
S=∑ni=1λ+iu(i)u(i)T
当我写这个答案时,我知道这适用于 Frobenius 范数投影,但并不知道它也适用于 2 范数投影。对于非对称,或者如果有额外的约束,这个简单的公式不适用,SDP 公式可能仍然有用。A