CVXOPT QP Solver: TypeError: «A» должна быть матрицей «d» с 1000 столбцов

Я пытаюсь использовать решатель 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' must be a 'd' matrix with 1000 columns

Я напечатал форму A, и это матрица (1,1000) после изменения формы из вектора. Что именно вызывает эту ошибку?


person Utumbu    schedule 08.04.2016    source источник
comment
Попробуйте также напечатать A.typecode, это 'd'?   -  person Haochen Wu    schedule 09.04.2016
comment
Если это не так, попробуйте сделать A=A.astype(double), прежде чем приводить его к матрице.   -  person Haochen Wu    schedule 09.04.2016
comment
Вот оно. Тип был 'i'. Добавил переменную tc в matrix(A, (1, m), 'd') и все заработало! Если вы хотите добавить это как ответ, я могу принять это!   -  person Utumbu    schedule 09.04.2016


Ответы (3)


Ваши матричные элементы также должны иметь тип с плавающей запятой. Таким образом, ошибка удаляется с помощью A = A.astype('float') для ее приведения.

person Haochen Wu    schedule 08.04.2016
comment
вы имеете в виду A=A.astype(float) - person Marko; 13.01.2019

Ошибка - "TypeError: 'A' must be a 'd' matrix with 1000 columns:" имеет два условия, а именно:

  1. если код типа не равен 'd'
  2. если A.size[1] != c.size[0].

Проверьте эти условия.

person Priya    schedule 22.04.2017

я попытался A=A.astype(double) решить эту проблему, но это неверно, так как python не знает, что такое double или A не имеет метода astype.

следовательно

с помощью A = matrix(A, (1, m), 'd') действительно может решить эту проблему!

person Joice Chan    schedule 17.04.2018