问题描述
我正在尝试使用 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) 矩阵.究竟是什么导致了这个错误?
推荐答案
你的矩阵元素也必须是浮点类型.因此,通过使用 A = A.astype('float') 进行转换来消除错误.