2017-01-27 4 views
1

«В целом, это улучшало бы производительность, создавая партии линейных ограничений, а не создавая их по одному. Я просто задаюсь вопросом, заявляет ли он даже с огромной проблемой ». - Мудрый программист.SVM с питоном и CPLEX, загружать квадратичную часть целевой функции

Чтобы быть ясным, у меня есть (35k x 40) набор данных, и я хочу сделать SVM на нем. Мне нужно, чтобы произвести матрицу Грамм этого набора данных, это прекрасно, но пройти коэффициент для CPLEX беспорядок, это занимает несколько часов, вот мой код:

nn = 35000 
    XXt = np.random.rand(nn,nn) # the gramm matrix of the dataset 
    yy = np.random.rand(nn)  # the label vector of the dataset 

    temp = ((yy*XXt).T)*yy 
    xg, yg = np.meshgrid(range(nn), range(nn)) 
    indici = np.dstack([yg,xg]) 

    quadraric_part = [] 
    for ii in xrange(nn): 
     for indd in indici[ii][ii:]: 
      quadraric_part.append([indd[0],indd[1],temp[indd[0],indd[1]]]) 

«quadratic_part» представляет собой список из form [i, j, c_ij], где c_ij - коэффициент, сохраненный в temp. Он будет передан функции 'object.set_quadratic_coefficients()' API-интерфейса CPLEX Python.

Существует более мудрый способ сделать это?

P.S. У меня, возможно, проблема с памятью, поэтому лучше всего будет хранить весь список «quadratic_part», вызывать несколько раз функцию «object.set_quadratic_coefficients()» ... вы знаете, что я имею в виду ?!

+0

Нет реального ответа, но зачем использовать общие решатели, когда настраиваемые решатели будут намного эффективнее ([например, используя этот подход] (http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html)) ? Одним очевидным ускорением будет использование предварительно выделенного массива quadratic_part. – sascha

+0

Вместо этого вы пытались использовать object.set_quadratic? – rkersh

+0

Я прочитал сообщение, scikit не будет работать для моей цели, потому что мне нужно решить mip, связанный с SVM, используя так называемое ограничение индикатора, которое реализовано в CPLEX. Что нужно подавать в 'object.set_quadratic'? Не могли бы вы записать небольшой пример? – Ufu

ответ

0

Под капотом objective.set_quadratic использует функцию CPXXcopyquad в C Callable Library. Принимая во внимание, что objective.set_quadratic_coefficients использует CPXXcopyqpsep.

Вот пример (имейте в виду, что я не NumPy эксперт, это вполне возможно, что есть лучший способ сделать эту часть):

import numpy as np 
import cplex 

nn = 5 # a small example size here 

XXt = np.random.rand(nn,nn) # the gramm matrix of the dataset 
yy = np.random.rand(nn)  # the label vector of the dataset 
temp = ((yy*XXt).T)*yy 

# create symetric matrix 
tempu = np.triu(temp)  # upper triangle 
iu1 = np.triu_indices(nn, 1) 
tempu.T[iu1] = tempu[iu1] # copy upper into lower 

ind = np.array([[x for x in range(nn)] for x in range(nn)]) 

qmat = [] 
for i in range(nn): 
    qmat.append([np.arange(nn), tempu[i]]) 

c = cplex.Cplex() 
c.variables.add(lb=[0]*nn) 
c.objective.set_quadratic(qmat) 
c.write("test2.lp") 

Ваш Q матрица полностью плотная, так в зависимости от объем вашей памяти, этот метод может не масштабироваться. Однако, когда это возможно, вы должны получить лучшую производительность, инициализируя свою Q-матрицу objective.set_quadratic. Возможно, вам понадобится использовать гибридную технику, в которой вы используете как set_quadratic, так и set_quadratic_coefficients.

+0

Очень хороший способ сделать cplex вместе с python! set_quadratic была функцией, которую я искал – Ufu

+0

Возможно, у вас есть намек на этот вопрос, http://stackoverflow.com/questions/41962488/decomposition-of-matrices-for-cplex-and-machine-learning-application?noredirect = 1 # comment71104913_41962488 – Ufu

Смежные вопросы