CVXOPT QP求解器:TypeError:'A'必须是具有1000列的'd'矩阵

14

我试图使用CVXOPT qp求解器来计算支持向量机的拉格朗日乘数

def svm(X, Y, c):
      m = len(X)
      P = matrix(np.dot(Y, Y.T) * np.dot(X, X.T))
      q = matrix(np.ones(m) * -1)
      g1 = np.asarray(np.diag(np.ones(m) * -1))
      g2 = np.asarray(np.diag(np.ones(m)))
      G = matrix(np.append(g1, g2, axis=0))
      h = matrix(np.append(np.zeros(m), (np.ones(m) * c), axis =0))
      A = np.reshape((Y.T), (1,m))
      b = matrix([0])

      print (A).shape

      A = matrix(A)

      sol = solvers.qp(P, q, G, h, A, b)
      print sol

这里X是一个1000 X 2的矩阵,Y具有相同数量的标签。求解器抛出以下错误:$ python svm.py (1, 1000) Traceback (most recent call last): File "svm.py", line 35, in <module> svm(X, Y, 50) File "svm.py", line 29, in svm sol = solvers.qp(P, q, G, h, A, b) File "/usr/local/lib/python2.7/site-packages/cvxopt/coneprog.py", line 4468, in qp return coneqp(P, q, G, h, None, A, b, initvals, options = options) File "/usr/local/lib/python2.7/site-packages/cvxopt/coneprog.py", line 1914, in coneqp %q.size[0]) TypeError: 'A'必须是具有1000列的'd'矩阵

我打印了A的形状,它是一个向量重塑后的(1,1000)矩阵。到底是什么导致了这个错误?


1
尝试打印A.typecode,它是'd'吗? - Haochen Wu
如果不是,尝试在将其转换为矩阵之前执行A=A.astype(double)。 - Haochen Wu
就是这样了。类型是 'i'. 在 matrix(A, (1, m), 'd') 中添加了tc变量,它起作用了!如果你想将它作为答案添加进来,我可以接受它! - Utumbu
4个回答

19

您的矩阵元素也必须是浮点类型。因此,通过使用A = A.astype('float')进行强制转换来消除错误。


1
你的意思是将 A 转换为浮点类型:A=A.astype(float)。 - Marko

4

我尝试使用A=A.astype(double)来解决问题,但是这是无效的,因为Python不知道double是什么或者A没有astype方法。

因此

通过使用A=matrix(A, (1, m), 'd')可以实际解决这个问题!


3
错误 - "TypeError: 'A'必须是一个具有1000列的'd'矩阵:" 有两个条件,即:

  1. 如果类型代码不等于'd'。
  2. 如果A.size[1] != c.size[0]

检查这些条件。


0

将CVXOPT矩阵项转换为浮点数:

A = A * 1.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接