使用 CVXPY 展开最大方差

问题描述 投票:0回答:0

我正在尝试重现 这篇论文 的结果,其中作者使用最大方差展开 (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
邻居,这成立。

python python-3.x mathematical-optimization cvxpy convex-optimization
© www.soinside.com 2019 - 2024. All rights reserved.