2016-04-08 137 views
2

我試圖使用CVXOPT QP求解器來計算拉格朗日乘子的支持向量機CVXOPT QP求解:類型錯誤:「A」必須是「d」與1000列

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 

這裏矩陣X1000 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)矩陣。究竟是什麼導致了這個錯誤?

+0

試着打印A.typecode,它是'd'嗎? –

+0

如果不是,在將其轉換爲矩陣之前,嘗試使用A = A.astype(double)。 –

+0

就是這樣。類型是**'我'**。在矩陣(A,(1,m),'d')'中添加了tc變量,它就起作用了!如果你想添加它作爲答案,我可以接受它! – Utumbu

回答

5

您的矩陣元素也必須是double類型的。所以只需使用A = A.astype(double)來施放它。

+0

非常感謝! –

0

錯誤 - "TypeError: 'A' must be a 'd' matrix with 1000 columns:"有兩個條件,即:

  1. 如果類型代碼是不等於 'd'
  2. 如果A.size[1] != c.size[0]

檢查這些條件。

相關問題