gpt4 book ai didi

python - SVM与python和CPLEX,加载目标函数的二次部分

转载 作者:行者123 更新时间:2023-11-30 09:20:23 26 4
gpt4 key购买 nike

''一般来说,创建一批线性约束比一次创建一个线性约束会获得更好的性能。我只是想知道它是否说明了一个巨大的问题。” - 明智的程序员。

需要明确的是,我有一个 (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”是 [i,j,c_ij] 形式的列表,其中 c_ij 是存储在 temp 中的系数。它将传递给 CPLEX Python API 的函数“objective.set_quadratic_coefficients()”。

有更明智的方法吗?

附注我可能有内存问题,所以最好存储整个列表“quadratic_part”,多次调用函数“objective.set_quadratic_coefficients()”....你知道我的意思吗?!

最佳答案

在幕后,objective.set_quadratic利用CPXXcopyquad C 可调用库中的函数。鉴于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 矩阵是完全密集的,因此根据您拥有的内存量,此技术可能无法扩展。不过,如果可能的话,使用 objective.set_quadratic 初始化 Q 矩阵应该会获得更好的性能。也许您需要使用某种混合技术,同时使用 set_quadraticset_quadratic_coefficients

关于python - SVM与python和CPLEX,加载目标函数的二次部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41891480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com