当前位置: 首页 > 知识库问答 >
问题:

CPLEX中的Python稀疏矩阵?

邢寒
2023-03-14

我正在研究一个大的二次规划问题。我希望使用Python API将定义目标函数的Q矩阵输入到IBM的Cplex中。由于Q矩阵是稀疏的,所以用scipy lil矩阵构造Q矩阵。理想情况下,我希望将矩阵传递到CPLEX上。Cplex是否接受scipy lil矩阵?

我可以将Q转换为Cplex接受的列表的格式,让我们称之为QMAT。但是qMat的大小变得太大,机器耗尽了内存(即使有120个Gig)。

下面是我正在进行的工作代码。在实际问题中,n大约是50万,m大约是500万。在实际问题中,Q是给定的,而不是像下面的问题那样随机分配的。

from __future__ import division
import numpy as np
import cplex
import sys
import random
from scipy import sparse

n = 10
m = 5

def create():
    Q = sparse.lil_matrix((n, n))
    nums = random.sample(range(0, n), m)
    for i in nums:
        for j in nums:
            a = random.uniform(0,1)
            Q[i,j] = a
            Q[j,i] = a
    return Q

def convert(Q):
    qMat = [[[], []] for _ in range(n)]
    for k in xrange(n-1):
        qMat[k][0] = Q.rows[k]
        qMat[k][1] = Q.data[k]
    return qMat

Q = create()
qMat = convert(Q)
my_prob = cplex.Cplex()
my_prob.objective.set_quadratic(qMat)

共有1个答案

融修平
2023-03-14

如果n=500000m=5000000,则为2.5e12非零。对于其中的每一个,您需要大约一个double来表示非零值,以及一个cpxdim来表示索引。即8+4=12个非零字节。这将给出:

>>> print(2.5e12 * 12 / 1024. / 1024. / 1024.)
27939.6772385

大约28TB内存!不清楚你计划有多少个非零,但使用这个计算,你可以很容易地发现是否可以做你要求的事情。

正如注释中提到的,CPLEX Python API不接受scipy lil矩阵。您可以尝试docplex,它是numpy友好的,或者您甚至可以尝试直接生成一个LP文件。

在减少转换开销方面,使用以下方法可能是您的最佳选择(我想我在上面的注释部分犯了一个一对一的错误):

my_prob.objective.set_quadratic(list(zip(Q.rows, Q.data)))

my_prob.objective.set_quadratic([[row, data] for row, data in zip(Q.rows, Q.data)]))

无论如何,您应该使用这些工具,看看什么能提供最好的性能(在速度和内存方面)。

 类似资料:
  • 问题内容: 我有一个很大的csv文件,其中列出了图中节点之间的连接。例: 0001,95784 0001,98743 0002,00082 0002,00091 因此,这意味着节点id 0001连接到节点95784和98743,依此类推。我需要将其读入numpy中的稀疏矩阵。我怎样才能做到这一点?我是python的新手,所以有关此的教程也将有所帮助。 问题答案: 使用scipy的lil_matri

  • 如何在python中找到包含负数的稀疏矩阵的sqrt?和对负数不起作用。我还尝试使用。但它也不起作用。

  • 2.5.1 介绍 (密集) 矩阵是: 数据对象 存储二维值数组的数据结构 重要特征: 一次分配所有项目的内存 通常是一个连续组块,想一想Numpy数组 快速访问个项目(*) 2.5.1.1 为什么有稀疏矩阵? 内存,增长是n**2 小例子(双精度矩阵): In [2]: import numpy as np import matplotlib.pyplot as plt x = np.li

  • 稀疏矩阵(Sparse Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 稀疏矩阵的概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目时,则称该矩阵为稀疏矩阵。与之相反,若非0元素数目占大多数时,则称该矩阵

  • 问题内容: 我有一个Sqlite数据库,其中包含以下类型的架构: 该表包含术语及其在文档中的各自计数。喜欢 该矩阵可以被视为稀疏矩阵,因为每个文档都包含很少的具有非零值的项。 我将如何使用numpy从稀疏矩阵创建密集矩阵,因为我必须使用余弦相似度来计算文档之间的相似度。 这个密集的矩阵看起来像一个表格,第一列为docid,所有术语列为第一行,其余单元格将包含计数。 问题答案: 我用熊猫解决了这个问

  • 我正在实现一个稀疏矩阵类,使用映射向量来存储数据(映射表示矩阵的一行,其中键是列的索引,值是该位置的maitrix的值)我已经编写了计算行列式的函数,但我不知道是否有一种方法可以计算这种节省的时间(因为矩阵是稀疏的,大多数值为零)在这里我的实现: 这是类接口 我计算行列式的方式是什么?假设运算符()以这种方式重载 提前感谢您的帮助

  • 在课堂上,我必须为稀疏矩阵编写自己的线性方程求解器。我可以自由地使用任何类型的数据结构为稀疏矩阵,我必须实现几个解决方案,包括共轭梯度。 谢了!

  • 问题内容: 使用SciPy / Numpy在Python中连接稀疏矩阵的最有效方法是什么? 在这里,我使用以下内容: 我想在回归中使用两个预测变量,但是当前格式显然不是我想要的格式。是否有可能获得以下信息: 它太大,无法转换为深格式。 问题答案: 您可以使用来连接行数相同的稀疏矩阵(水平串联): 同样,您可以用于将具有相同列数的稀疏矩阵进行串联(垂直串联)。 使用或将创建带有两个稀疏矩阵对象的数组