首页 > 解决方案 > CVXPY 中的最小二乘问题内存不足

问题描述

我已在 Google Group 中发布了此内容,但希望在这里能得到更快的回复。我有一个简单的最小二乘问题,有很多观察结果。该向量有 200,000 个观察值,但我希望 cvxpy 简单地将每个元素平方并求和。

import cvxpy as cp
import numpy as np


N = 200000
M = 100


X = np.random.normal(0., 1., size=(N, M))
cov = np.cov(X, rowvar=False)
y = 2 * X[:,0] + 0.5 * X[:,1] + np.random.normal(0., 1., size=N)


w = cp.Variable(M)
w.value = np.ones(M) / M
prob = cp.Problem(cp.Minimize(cp.sum_squares(y - X @ w) / N))
prob.solve()

上面不需要形成 N x N 的矩阵,但它确实需要(参见堆栈跟踪的末尾),并且内存不足。

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-1-fb190a76c06f> in <module>()
     12 w.value = np.ones(M) / M
     13 prob = cp.Problem(cp.Minimize(cp.sum_squares(y - X @ w) / N))
---> 14 prob.solve()

/anaconda3/lib/python3.7/site-packages/cvxpy/problems/problem.py in solve(self, *args, **kwargs)
    244         else:
    245             solve_func = Problem._solve
--> 246         return solve_func(self, *args, **kwargs)
    247
    248     @classmethod

/anaconda3/lib/python3.7/site-packages/cvxpy/problems/problem.py in _solve(self, solver, ignore_dcp, warm_start, verbose, parallel, **kwargs)
    356                 raise e
    357
--> 358         data, inverse_data = self._solving_chain.apply(self)
    359         solution = self._solving_chain.solve_via_data(self, data, warm_start, verbose,
    360                                                       kwargs)

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/chain.py in apply(self, problem)
     56         inverse_data = []
     57         for r in self.reductions:
---> 58             problem, inv = r.apply(problem)
     59             inverse_data.append(inv)
     60         return problem, inverse_data

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/qp2quad_form/qp2symbolic_qp.py in apply(self, problem)
     53         if not self.accepts(problem):
     54             raise ValueError("Cannot reduce problem to symbolic QP")
---> 55         return Canonicalization(qp_canon_methods).apply(problem)

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/canonicalization.py in apply(self, problem)
     39
     40         canon_objective, canon_constraints = self.canonicalize_tree(
---> 41             problem.objective)
     42
     43         for constraint in problem.constraints:

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/canonicalization.py in canonicalize_tree(self, expr)
     76             constrs = []
     77             for arg in expr.args:
---> 78                 canon_arg, c = self.canonicalize_tree(arg)
     79                 canon_args += [canon_arg]
     80                 constrs += c

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/canonicalization.py in canonicalize_tree(self, expr)
     76             constrs = []
     77             for arg in expr.args:
---> 78                 canon_arg, c = self.canonicalize_tree(arg)
     79                 canon_args += [canon_arg]
     80                 constrs += c

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/canonicalization.py in canonicalize_tree(self, expr)
     79                 canon_args += [canon_arg]
     80                 constrs += c
---> 81             canon_expr, c = self.canonicalize_expr(expr, canon_args)
     82             constrs += c
     83         return canon_expr, constrs

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/canonicalization.py in canonicalize_expr(self, expr, args)
     95                 return Constant(expr.value), []
     96         elif type(expr) in self.canon_methods:
---> 97             return self.canon_methods[type(expr)](expr, args)
     98         else:
     99             return expr.copy(args), []

/anaconda3/lib/python3.7/site-packages/cvxpy/reductions/qp2quad_form/atom_canonicalizers/quad_over_lin_canon.py in quad_over_lin_canon(expr, args)
     27     y = args[1]
     28     t = Variable(affine_expr.shape)
---> 29     return SymbolicQuadForm(t, eye(affine_expr.size)/y, expr), [affine_expr == t]

/anaconda3/lib/python3.7/site-packages/numpy/lib/twodim_base.py in eye(N, M, k, dtype, order)
    199     if M is None:
    200         M = N
--> 201     m = zeros((N, M), dtype=dtype, order=order)
    202     if k >= M:
    203         return m

MemoryError: Unable to allocate array with shape (200000, 200000) and data type float64

知道我在这里做错了什么吗?

标签: pythoncvxpy

解决方案


推荐阅读