支持向量机结合python和CPLEX,对目标函数的二次部分进行加载

2024-06-23 19:44:54 发布

您现在位置:Python中文网/ 问答频道 /正文

“总的来说,创建一批线性约束比一次创建一个约束更能获得更好的性能。我只是想知道它是否有一个巨大的问题。在

为了清楚起见,我有一个(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_平方系数()'.... 你知道我的意思吗?!在


Tags: ofthe数据nprandomnntempdataset
1条回答
网友
1楼 · 发布于 2024-06-23 19:44:54

在幕后,objective.set_quadratic利用了C可调用库中的CPXXcopyquad函数。然而,objective.set_quadratic_coefficients使用CPXXcopyqpsep。在

以下是一个例子(请记住,我不是一个裸体专家;很可能有更好的方法来完成这一部分):

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矩阵是完全密集的,因此根据你的内存量,这种技术可能无法扩展。但是,如果可能的话,用objective.set_quadratic初始化Q矩阵应该可以获得更好的性能。也许您需要使用一些混合技术,同时使用set_quadratic和{}。在

相关问题 更多 >

    热门问题