帕龙-弗罗贝尼乌斯矩阵补全
DGP原子库包含了几个正矩阵的函数,包括迹、乘积、和、帕龙-弗罗贝尼乌斯特征值和 :math:`(I - X)^{-1}`(单位矩阵减逆矩阵)。在这个笔记本中,我们使用其中一些原子来制定和解决一个有趣的矩阵补全问题。
在这个问题中,我们已知一个逐元素正的矩阵 \(A\) 的一些条目,目标是选择缺失的条目以使帕龙-弗罗贝尼乌斯特征值或谱半径最小化。设 \(\Omega\) 为 \(A_{ij}\) 已知的索引 \((i, j)\) 的集合,优化问题为
\[\begin{split}\begin{equation}
\begin{array}{ll}
\mbox{minimize} & \lambda_{\text{pf}}(X) \\
\mbox{subject to} & \prod_{(i, j) \not\in \Omega} X_{ij} = 1 \\
& X_{ij} = A_{ij}, \, (i, j) \in \Omega,
\end{array}
\end{equation}\end{split}\]
这是一个对数-对数凸规划问题。下面是这个问题的一个实现,具体问题数据如下:
\[\begin{split}A = \begin{bmatrix}
1.0 & ? & 1.9 \\
? & 0.8 & ? \\
3.2 & 5.9& ?
\end{bmatrix},\end{split}\]
其中问号表示缺失的条目。
import cvxpy as cp
n = 3
known_value_indices = tuple(zip(*[[0, 0], [0, 2], [1, 1], [2, 0], [2, 1]]))
known_values = [1.0, 1.9, 0.8, 3.2, 5.9]
X = cp.Variable((n, n), pos=True)
objective_fn = cp.pf_eigenvalue(X)
constraints = [
X[known_value_indices] == known_values,
X[0, 1] * X[1, 0] * X[1, 2] * X[2, 2] == 1.0,
]
problem = cp.Problem(cp.Minimize(objective_fn), constraints)
problem.solve(gp=True)
print("Optimal value: ", problem.value)
print("X:\n", X.value)
Optimal value: 4.702374203221372
X:
[[1. 4.63616907 1.9 ]
[0.49991744 0.8 0.37774148]
[3.2 5.9 1.14221476]]