'SVM multiclass optimization using cvxpy

Trying to solve multiclass svm using below formulations.

size = 28*28

W_0 = Variable((size,1))
W_1 = Variable((size,1))
W_2 = Variable((size,1))

W = np.array([W_0,W_1,W_2])


Psi_0 = Variable(len(x_0_0)+len(x_0_1))
Psi_1 = Variable(len(x_1_0)+len(x_1_1))
Psi_2 = Variable(len(x_2_0)+len(x_2_1))

C = 0.01

obj = Minimize(0.5*( square(norm(W[0],2)) + square(norm(W[1],2)) +square(norm(W[2],2))) + C * (sum(Psi_0) + sum(Psi_1) + sum(Psi_2)))
#Class_0 constraints
x_01_1_constraints = [(((W[0].T) - W[1].T) @ np.reshape(x_0_1[i],(size,1))) >= 1 - Psi_0[i] for i in range(0, len(x_0_0) + len(x_0_1), 1)]
x_02_1_constraints = [(((W[0].T) - W[2].T) @ np.reshape(x_0_1[i],(size,1))) >= 1 - Psi_0[i] for i in range(0, len(x_0_0) + len(x_0_1), 1)]


#Class_1 constraints
x_10_1_constraints = [(((W[1].T) - W[0].T) @ np.reshape(x_1_1[i],(size,1))) >= 1 - Psi_1[i] for i in range(0, len(x_1_0) + len(x_1_1), 1)]
x_12_1_constraints = [(((W[1].T) - W[2].T) @ np.reshape(x_1_1[i],(size,1))) >= 1 - Psi_1[i] for i in range(0, len(x_1_0) + len(x_1_1), 1)]


#Class_2 constraints
x_20_1_constraints = [(((W[2].T) - W[0].T) @ np.reshape(x_2_1[i],(size,1))) >= 1 - Psi_2[i] for i in range(0, len(x_2_0) + len(x_2_1), 1)]
x_21_1_constraints = [(((W[2].T) - W[1].T) @ np.reshape(x_2_1[i],(size,1))) >= 1 - Psi_2[i] for i in range(0, len(x_2_0) + len(x_2_1), 1)]


z_constraints_0_0 = [Psi_0[i] >= 0 for i in range(len(x_0_0)) ]
z_constraints_1_0 = [Psi_1[i] >= 0 for i in range(len(x_1_0)) ]
z_constraints_2_0 = [Psi_2[i] >= 0 for i in range(len(x_2_0)) ]

z_constraints_0_1 = [Psi_0[i] >= 0 for i in range(len(x_0_0), len(x_0_0) + len(x_0_1), 1) ]
z_constraints_1_1 = [Psi_1[i] >= 0 for i in range(len(x_1_0), len(x_1_0) + len(x_1_1), 1) ]
z_constraints_2_1 = [Psi_2[i] >= 0 for i in range(len(x_2_0), len(x_2_0) + len(x_2_1), 1) ]


constraints0 = x_01_1_constraints + x_02_1_constraints
constraints1 = x_10_1_constraints + x_12_1_constraints
constraints2 = x_20_1_constraints + x_21_1_constraints

constraints_1 = constraints0 + constraints1 + constraints2

z_constraints0 = z_constraints_0_0 + z_constraints_1_0 + z_constraints_2_0
z_constraints1 = z_constraints_0_1 + z_constraints_1_1 + z_constraints_2_1


constraints = constraints_1 + z_constraints0 + z_constraints1

prob = Problem(obj, constraints)

print(prob.is_dcp())

prob.solve(verbose=True)
print("Problem Status: %s"%prob.status)

Could see that it is taking 2 to 3 days to solve the above problem (using ECOS solver). Is there anyway we can speed up this? Below is the snapshot where it is taking more time during compilation.

                                 CVXPY                                     
                                 v1.2.0                                    

(CVXPY) May 14 06:03:03 AM: Your problem has 20975 variables, 55869 constraints, and 0 parameters.

(CVXPY) May 14 06:03:07 AM: It is compliant with the following grammars: DCP, DQCP

(CVXPY) May 14 06:03:07 AM: (If you need to solve this problem multiple times, but with different data, consider using parameters.)

(CVXPY) May 14 06:03:07 AM: CVXPY will first compile your problem; then, it will invoke a numerical solver to obtain a solution.

                              Compilation                                  

(CVXPY) May 14 06:03:09 AM: Compiling problem (target solver=ECOS).

(CVXPY) May 14 06:03:09 AM: Reduction chain: Dcp2Cone -> CvxAttr2Constr -> ConeMatrixStuffing -> ECOS

(CVXPY) May 14 06:03:09 AM: Applying reduction Dcp2Cone

(CVXPY) May 14 06:03:22 AM: Applying reduction CvxAttr2Constr

(CVXPY) May 14 06:03:23 AM: Applying reduction ConeMatrixStuffing



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source