«В целом, это улучшало бы производительность, создавая партии линейных ограничений, а не создавая их по одному. Я просто задаюсь вопросом, заявляет ли он даже с огромной проблемой ». - Мудрый программист.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()» ... вы знаете, что я имею в виду ?!
Нет реального ответа, но зачем использовать общие решатели, когда настраиваемые решатели будут намного эффективнее ([например, используя этот подход] (http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html)) ? Одним очевидным ускорением будет использование предварительно выделенного массива quadratic_part. – sascha
Вместо этого вы пытались использовать object.set_quadratic? – rkersh
Я прочитал сообщение, scikit не будет работать для моей цели, потому что мне нужно решить mip, связанный с SVM, используя так называемое ограничение индикатора, которое реализовано в CPLEX. Что нужно подавать в 'object.set_quadratic'? Не могли бы вы записать небольшой пример? – Ufu