我正在尝试重现 这篇论文 的结果,其中作者使用最大方差展开 (MVU) 来学习一些分布的低维表示。我正在尝试在一个数据集上复制他们的实验,该数据集由同一个逐渐旋转的茶壶的 400 张图像(76x101 像素)组成。我首先导入数据和相关库:
import scipy.io
import cvxpy as cvx
import numpy as np
from sklearn.neighbors import NearestNeighbors
data = scipy.io.loadmat('teapots.mat')
data = data["Input"][0][0][0]
# make it (400 x 23028)
data = data.T.astype(np.float64)
然后,我构建了每个数据点的 k 个最近邻的邻接矩阵表示:
n_points = data.shape[0]
# create sparse matrix (400 x 400) with the connections
nn = NearestNeighbors(n_neighbors=4).fit(data)
nn = nn.kneighbors_graph(data).todense()
nn = np.array(nn)
最后,我尝试执行 MVU 以使用 CVXPY 发现这些数据的低维嵌入:
# inner product matrix of the original data
X = cvx.Constant(data.dot(data.T))
# inner product matrix of the projected points; PSD constrains G to be both PSD and symmetric
G = cvx.Variable((n_points, n_points), PSD=True)
G.value = np.zeros((n_points, n_points))
# spread out points in target manifold
objective = cvx.Maximize(cvx.trace(G))
constraints = []
# add distance-preserving constraints
for i in range(n_points):
for j in range(n_points):
if nn[i, j] == 1:
constraints.append(
(X[i, i] - 2 * X[i, j] + X[j, j]) -
(G[i, i] - 2 * G[i, j] + G[j, j]) == 0
)
problem = cvx.Problem(objective, constraints)
problem.solve(verbose=True, max_iters=10000000)
print(problem.status)
然而,CVXPY告诉我问题是
infeasible
。如果我删除约束,求解器会说问题是 unbounded
,这是有道理的,因为我正在最大化决策变量的凸函数。那么,我的问题是我在 MVU 的表述中犯了什么错误。提前谢谢你!
我在上面的代码中省略了邻接图未断开的验证。为此,我只需对邻接图执行 DFS 并断言访问的节点数等于数据中的行数。对于
n=4
邻居,这成立。