在Matlab中,如果我还有很多计算要做,那么稀疏数组比普通数组更好,大约25%的数组是非零?
是否有任何包可以执行稀疏线性代数计算,可能基于快速高效的C库?我搜索了Hackage,但我没有发现任何关注:hmatrix,它使用GSL,BLAS和LAPACK,很棒,但似乎没有包含特殊算法来解决稀疏矩阵的线性系统和特征值/向量问题.我想要找到的,它类似于scipy中的sparse.linalg模块.谢谢!
感谢任何帮助,以便在从scipy.sparse包中切割lil_matrix(A)时理解以下行为.
实际上,我想基于行和列的任意索引列表提取子矩阵.
当我使用这两行代码时:
x1 = A[list 1,:]
x2 = x1[:,list 2]
Run Code Online (Sandbox Code Playgroud)
一切都很好,我可以提取正确的子矩阵.
当我尝试在一行中执行此操作时,它失败了(返回的矩阵为空)
x=A[list 1,list 2]
Run Code Online (Sandbox Code Playgroud)
为什么会这样?总的来说,我在matlab中使用了类似的命令,并在那里工作.那么,为什么不使用第一个,因为它有效?这似乎非常耗时.由于我必须经历大量的条目,我想使用单个命令加速它.也许我使用错误的稀疏矩阵类型......任何想法?
我有一个非常大的吸收马尔可夫链(扩展到问题大小 - 从10个状态到数百万个)非常稀疏(大多数状态只能对4或5个其他状态作出反应).
我需要计算该链的基本矩阵的一行(给定一个起始状态的每个状态的平均频率).
通常,我会通过计算来做到这一点(I - Q)^(-1),但我找不到一个实现稀疏矩阵逆算法的好库!我已经看过几篇论文,其中大部分都是博士级的工作.
我的大部分Google结果都指向了一些帖子,讨论在解决线性(或非线性)方程组时如何不应该使用矩阵逆...我觉得这没有特别有用.基本矩阵的计算是否类似于求解方程组,我根本不知道如何以另一个的形式表达一个?
所以,我提出两个具体问题:
计算稀疏矩阵的逆的行(或所有行)的最佳方法是什么?
要么
计算大吸收马尔可夫链基本矩阵的最佳方法是什么?
一个Python解决方案会很精彩(因为我的项目目前仍然是一个概念验证),但是如果我不得不用一些好的'Fortran或C弄脏,那不是问题.
编辑:我刚刚意识到矩阵A的逆B可以定义为AB = I,其中I是单位矩阵.这可能会允许我使用一些标准的稀疏矩阵解算器来计算逆...我得赶紧走了,可以随意完成我的思路,我刚开始想可能只需要一个非常基本的矩阵属性...
如何转换Eigen::Matrix<double,Dynamic,Dynamic>为Eigen::SparseMatrix<double>?我正在寻找一种更好的方法,而不是遍历密集矩阵
我有大约1000个维度50000的向量x_i,但它们非常稀疏; 每个只有大约50-100个非零元素.我想在这个数据集上(在MATLAB中)做PCA,以减少数据的不必要的极端维度.
不幸的是,由于需要从所有示例中减去均值,我不知道在没有中间完整矩阵的情况下如何做到这一点.当然,1000x50000矩阵太大而无法放入内存(当我尝试时,它实际上因某些原因而崩溃了我的整台计算机).princomp当我尝试使用它时,Matlab的内置程序会崩溃我的计算机.
所以我的问题是:有没有办法对这些数据进行PCA而不需要大量的非稀疏矩阵作为中间步骤?
有谁知道如何从python中的一个非常大的稀疏矩阵计算相关矩阵?基本上,我正在寻找类似于numpy.corrcoefscipy稀疏矩阵的东西.
我试图从一个巨大的(1Mx1M)CSR矩阵(SciPy)中过滤小于10的值.由于我的所有值都是整数,除以10并且重新乘以10就可以完成这项工作,但我想知道是否有更好的方法来过滤元素.
编辑: 下面的答案有效.检查您是否拥有最新版本的SciPy.
我试图在张量流中训练一个稀疏变量,据我所知,当前张量流不允许稀疏变量.
我找到了两个讨论类似问题的线程:using-sparsetensor-as-a-trainable-variable和update-only-the-the-word-embedding-matrix-in-tensorflow.我不太明白答案,如果有任何示例代码会很好
我试过的一种方法是:
# initialize the sparse variable sp_weights
# assuming w_s is the input sparse matrix contains indices information
dim=20
identity = tf.constant(np.identity(dim), dtype=tf.float32)
A=tf.sparse_tensor_dense_matmul(w_s, identity) # convert w_s to dense
w_init = tf.random_normal([dim, dim], mean=0.0, stddev=0.1)
w_tensor = tf.mul(A, w_init) # random initialize sparse tensor
vars['sp_weights'] = tf.Variable(w_tensor)
# doing some operations...
Run Code Online (Sandbox Code Playgroud)
当计算梯度时,根据第二个链接使用tf.IndexedSlices
grad = opt.compute_gradients(loss)
train_op = opt.apply_gradients(
[tf.IndexedSlices(grad, indices)]) # indices is extracted from w_s
Run Code Online (Sandbox Code Playgroud)
上面的代码当然不起作用,我在这里很困惑.tf.IndexedSlices使输入成为IndexedSlices实例,如何使用它来更新给定索引的渐变?此外,许多人提到使用tf.scatter_add/sub/update.官方文档不包含有关如何使用以及在何处使用渐变更新的示例代码.我应该使用tf.IndexedSlices还是tf.scatter?如果有任何示例代码,将会非常有用.谢谢!
我有一个稀疏矩阵的行信息的Python列表.每行表示为(列,值)元组的列表.叫它alist:
alist = [[(1,10), (3,-3)],
[(2,12)]]
Run Code Online (Sandbox Code Playgroud)
如何从列表列表中有效地构造一个scipy稀疏矩阵,得到如下矩阵:
0 10 0 -3
0 0 12 0
Run Code Online (Sandbox Code Playgroud)
显而易见的方法是制作一个scipy.sparse.lil_matrix内部具有此"列表列表"结构的内容.但是从scipy.sparse.lil_matrix - SciPy v0.19.0参考指南中我只看到了构建它们的三种方法:
因此,获取新数据的唯一方法是使用其他稀疏矩阵表示来解决此问题,或者从密集数组开始,这两者都没有解决初始问题,并且这两者似乎都是效率低于表示的lil_matrix本身就是这个数据.
我想我可以制作一个空的,并使用循环来添加值,但我肯定错过了一些东西.
在稀疏矩阵方面,scipy文档非常令人沮丧.
sparse-matrix ×10
python ×5
scipy ×4
matlab ×2
algorithm ×1
c++ ×1
constructor ×1
correlation ×1
eigen ×1
haskell ×1
math ×1
matrix ×1
numpy ×1
pca ×1
performance ×1
slice ×1
submatrix ×1
tensorflow ×1