“总的来说,创建一批线性约束比一次创建一个约束更能获得更好的性能。我只是想知道它是否有一个巨大的问题。在
为了清楚起见,我有一个(35k×40)数据集,我想对它进行支持向量机。我需要生成这个数据集的gram矩阵,这很好,但是将系数传递给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]]])
“二次方”是[i,j,c_ij]形式的列表,其中c_ij是存储在temp中的系数。它将传递给函数'objective.set_平方系数CPLEX Python API的()属性。在
有更明智的方法吗?在
另外,我可能有内存问题,所以它会更好,而不是存储整个列表的“二次方”部分,调用几次函数'objective.set_平方系数()'.... 你知道我的意思吗?!在
在幕后,objective.set_quadratic利用了C可调用库中的CPXXcopyquad函数。然而,objective.set_quadratic_coefficients使用CPXXcopyqpsep。在
以下是一个例子(请记住,我不是一个裸体专家;很可能有更好的方法来完成这一部分):
你的Q矩阵是完全密集的,因此根据你的内存量,这种技术可能无法扩展。但是,如果可能的话,用}。在
objective.set_quadratic
初始化Q矩阵应该可以获得更好的性能。也许您需要使用一些混合技术,同时使用set_quadratic
和{相关问题 更多 >
编程相关推荐