- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我用大写字母表示矩阵,用小写字母表示向量。
我需要为向量求解以下线性不等式系统 v
:
min(rv - (u + Av), v - s) = 0
0
是一个零向量。
r
是标量,
u
和
s
是向量,而
A
是一个矩阵。
z = v-s
,
B=rI - A
,
q=-u + Bs
,我可以将之前的问题改写为
linear complementarity problem并希望使用 LCP 求解器,例如来自
openopt
:
LCP(M, z): min(Bz+q, z) = 0
z'(Bz+q) = 0
z >= 0
Bz + q >= 0
A
, 一世
A11
, A12
, A21
, A22
使用 scipy.sparse.diags
A = scipy.sparse.bmat([[A11, A12], [A21, A22]])
A
不是对称的,因此一些有效的转换为 QP
问题将不起作用)openopt.LCP
显然无法处理稀疏矩阵:当我运行它时,我的计算机崩溃了。一般情况下,
A.todense()
会导致内存错误。同样,
compecon-python
无法解决
LCP
稀疏矩阵的问题。
LCP
实现适合这个问题?
from numpy.random import rand
from scipy import sparse
n = 3000
r = 0.03
A = sparse.diags([-rand(n)], [0])
s = rand(n,).reshape((-1, 1))
u = rand(n,).reshape((-1, 1))
B = sparse.eye(n)*r - A
q = -u + B.dot(s)
q.shape
Out[37]: (3000, 1)
B
Out[38]:
<3000x3000 sparse matrix of type '<class 'numpy.float64'>'
with 3000 stored elements in Compressed Sparse Row format>
openopt.LCP
与我的矩阵崩溃,我认为它在继续之前将矩阵转换为密集矩阵 compecon-python
完全失败并出现一些错误,它显然需要密集矩阵并且没有稀疏性的后备B
不是半正定的,所以我不能将线性互补问题 (LCP) 改写为凸二次问题 (QP) 最佳答案
这个问题有一个非常有效的(线性时间)解决方案,尽管它需要一些讨论......
第零:澄清问题/LCP
根据评论中的澄清,@FooBar 表示原始问题是元素方面的 min
;我们需要找到一个 z
(或 v
)使得
either the left argument is zero and the right argument is non-negative or the left argument is non-negative and the right argument is zero
z
中有一个二次项(Bz+q)'z,但原始问题没有(只有线性项 Bz+q 和 z)。我将在下面利用这一事实。
- Create four matrices A11, A12, A21, A22 using scipy.sparse.diags
- And stack them together as A = scipy.sparse.bmat([[A11, A12], [A21, A22]])
A
的块对角结构在所有后续操作中都保留矩阵。并且每个后续操作都是矩阵向量乘法或内积。这意味着该程序实际上可以成对分离
z
(或
v
)变量。
A11,...
是尺寸
n
来自
n
.然后批判性地注意到
z_1
和
z_{n+1}
出现
只有在方程式和术语中,而不是在其他地方。所以问题可分为
n
问题,每个问题都是二维的。因此,我以后将解决二维问题,您可以在
n
上进行串行化或并行化。如您所见,没有稀疏矩阵或大型 opt 包。
find z such that (elementwise) min( Bz + q , z ) = 0, or declare that no such `z` exists.
B
现在是 2x2,这个几何问题对应于我们可以手动枚举的四个标量不等式(我将它们命名为 a1、a2、z1、z2):
“a1”: B11*z1 + B12*z2 + q1 >=0
“a2”: B21*z1 + B22*z2 + q2 >=0
“z1”: z1 >= 0
“z2:” z2 >= 0
z
其中实现了以下解决方案之一(并非完全不同,但无关紧要):
z
存在。
B^-1q
(请注意,即使 B 不是 psd,我也假设它是可逆的/满级)。所以:
if B^-1q is elementwise nonnegative, return z = B^-1q.
elif q is elementwise nonnegative, return z = 0.
elif -q2/B22 >=0 and -B22/B12*q2 + q1 >=0, return z1= 0, z2 = -q2/B22.
elif -q1/B11 >=0 and -B21/B11*q1 + q2 >=0, return z1 = -q1/B11, z2 =0.
else return None
None
.然后对所有
n
做同样的事情2D 问题,并连接向量。如果有任何是 None,则问题不可行(所有 None)。否则,你有你的答案。
关于python - 具有稀疏矩阵的 LCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403066/
我在服务器上 checkout 了一个 git 存储库。该存储库过去在根目录下包含所有相关文件,但我必须进行一些更改,现在我有两个文件夹,src 和 dist,我想跟踪这两个文件夹. 我遇到的问题是,
我很难弄清楚 VkDescriptorSetLayoutBinding::binding 的任何用例,这是结构: struct VkDescriptorSetLayoutBinding { u
Python中能否有效获取稀疏向量的范数? 我尝试了以下方法: from scipy import sparse from numpy.linalg import norm vector1 = spa
我正在尝试找出为什么这段代码不对数组进行排序... 任意向量。 x = array([[3, 2, 4, 5, 7, 4, 3, 4, 3, 3, 1, 4, 6, 3, 2, 4, 3, 2]])
有谁知道如何压缩(编码)稀疏 vector ?稀疏 vector 表示有许多“0”的 1xN 矩阵。 例如 10000000000001110000000000000000100000000 上面是稀
我使用稀疏高斯过程进行 Rasmussen 回归。[http://www.tsc.uc3m.es/~miguel/downloads.php][1] 预测平均值的语法是: [~, mu_1, ~, ~
我在朴素贝叶斯分类器中使用 Mahout API。其中一个功能是 SparseVectorsFromSequenceFiles虽然我已经尝试过旧的谷歌搜索,但我仍然不明白什么是稀疏 vector 。最
我正在尝试将JavaScript稀疏数组映射到C#表示形式。 建议这样做的方法是什么? 它正在考虑使用一个字典,该字典包含在原始数组中包含值的原始词列表。 还有其他想法吗? 谢谢! 最佳答案 注意 针
如果我想求解一个完整上三角系统,我可以调用linsolve(A,b,'UT')。然而,这目前不支持稀疏矩阵。我该如何克服这个问题? 最佳答案 UT 和 LT 系统是最容易解决的系统之一。读一读on t
我有一个带有 MultiIndex 的 Pandas DataFrame。 MultiIndex 的值在 (0,0) 到 (1000,1000) 范围内,该列有两个字段 p 和 q. 但是,DataF
我目前正在实现一个小型有限元模拟。使用 Python/Numpy,我正在寻找一种有效的方法来创建全局刚度矩阵: 1)我认为应该使用coo_matrix()从较小的单元刚度矩阵创建稀疏矩阵。但是,我可以
a , b是 1D numpy ndarray与整数数据类型具有相同的大小。 C是一个 2D scipy.sparse.lil_matrix . 如果索引[a, b]包含重复索引,C[a, b] +=
我有一个大的、连通的、稀疏的邻接表形式的图。我想找到两个尽可能远的顶点,即 diameter of the graph以及实现它的两个顶点。 对于不同的应用程序,我对无向和有向情况下的这个问题都很感兴
上下文:我将 Eigen 用于人工神经网络,其中典型维度为每层约 1000 个节点。所以大部分操作是将大小为 ~(1000,1000) 的矩阵 M 与大小为 1000 的 vector 或一批 B v
我有一些大小合适的矩阵 (2000*2000),我希望在矩阵的元素中有符号表达式 - 即 .9**b + .8**b + .7**b ... 是一个元素的例子。矩阵非常稀疏。 我通过添加中间计算来创建
在 R 或 C++ 中是否有一种快速填充(稀疏)矩阵的方法: A, B, 0, 0, 0 C, A, B, 0, 0 0, C, A, B, 0 0, 0, C, A, B 0, 0, 0, C, A
我有一个大的稀疏 numpy/scipy 矩阵,其中每一行对应于高维空间中的一个点。我想进行以下类型的查询: 给定一个点P(矩阵中的一行)和一个距离epsilon,找到与epsilon距离最大的所有点
假设我有一个 scipy.sparse.csr_matrix 代表下面的值 [[0 0 1 2 0 3 0 4] [1 0 0 2 0 3 4 0]] 我想就地计算非零值的累积和,这会将数组更改为:
我了解如何在 Git 中配置稀疏 checkout ,但我想知道是否可以消除前导目录。例如,假设我有一个 Git 存储库,其文件夹结构如下: 文件夹1/foo 文件夹2/foo/bar/stuff 文
根据 this thread , Git 中的排除 sparse-checkout feature应该实现。是吗? 假设我有以下结构: papers/ papers/... presentations
我是一名优秀的程序员,十分优秀!