python - 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
知道我在这里做错了什么吗?
解决方案
推荐阅读
- swift - 添加到 UITableViewController 时,SwiftUI 视图大小被破坏
- javascript - 无法为包含某些文本的按钮触发 jQuery .click()?
- kubernetes - 无法使用 Minikube 在本地访问我的 Pod
- reactjs - Why is CDN Linking to ReactJS Not Working
- pandas - 如何重塑熊猫数据框作为 keras simpleRNN 的输入?
- amazon-web-services - textract_python_table_parser.py 命令提示符缺少凭据
- javascript - 如何使高图跨越整个x轴?
- python - 如果条件为真,则带有不同标记的线图 python 3
- dataweave - Mule 4:Dataweave:如何进行以下转换?
- ruby-on-rails - 带有会话中间件的 Rails API 多个数据库不起作用