【问题标题】:converting numpy vector to cvxopt将 numpy 向量转换为 cvxopt
【发布时间】:2015-10-29 19:31:58
【问题描述】:

这可能是一个非常愚蠢的问题,但我一直在努力解决它,在文档中找不到它。

我正在尝试使用description given here 进行二次规划。 documentation here 仅涵盖将二维 numpy 数组转换为 cvxopt 数组,而不是一维 numpy 数组。

我的目标函数(1/2)x' P x + q' xq 向量是一个numpy 向量,例如大小为n

我尝试通过以下方式将 q 从 numpy 转换为 cvxopt:

import cvxopt as cvx
cvx_q = cvx.matrix(q)   # didn't work
cvx_q = cvx.matrix(q, (n, 1)) # didn't work
cvx_q = cvx.matrix(np.array([q])) # didn't work
cvx_q = cvx.matrix(np.array([q]), (1, n)) # didn't work
cvx_q = cvx.matrix(np.array([q]), (n, 1)) # didn't work

在所有情况下,我都会得到答案TypeError: buffer format not supported

但是,numpy 矩阵似乎可以正常工作,例如

cvx_p = cvx.matrix(p)   # works fine, p is a n x n numpy matrix

如果我尝试运行优化而不将 numpy 向量转换为 cvxopt 格式,如下所示:

cvxs.qp(cvx_p, cvx_q, cvx_g, cvx_h, cvx_a, cvx_b)

我收到一个错误:TypeError 'q' must be a 'd' matrix with one column

将 numpy 向量转换为具有一列的 cvxopt 矩阵的正确方法是什么?

【问题讨论】:

标签: python numpy cvxopt


【解决方案1】:

您没有包含任何示例数据,但是当我遇到此错误时,是因为 dtype。

尝试:

q = q.astype(np.double)
cvx_q = matrix(q)

CVX 只接受双精度数,不接受整数。

【讨论】:

  • 严格来说,cvxopt.qp 求解器的所有参数都需要双浮点数。 CVXOPT 本身确实支持整数矩阵(cvxopt.matrix(np.arange(5)) 将返回一个类型码为'i' 的整数矩阵)。
【解决方案2】:

其中一个关键错误是您假设 CVX 接受 int,这是不正确的。 CVX 只接受双倍。所以,正确的做法可能是:

import cvxopt as cp
if not isinstance(q, np.double): 
  q.astype(np.double)
cvx_q = cp.matrix(q) 

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2019-05-19
    • 2016-02-28
    • 2016-02-02
    • 2018-10-01
    相关资源
    最近更新 更多