稀疏矩阵格式(dok)假设不在字典中的键的值等于零.有没有办法让它使用除零以外的默认值?
还有,有办法计算稀疏矩阵的日志(类似于常规numpy矩阵中的np.log)
我正在使用python中的大型稀疏矩阵(文本生成的文档特征矩阵).它需要相当多的处理时间和内存来咀嚼这些,我想稀疏矩阵可以提供一些改进.但是我担心使用稀疏矩阵库会使插入其他python(和R,通过rpy2)模块变得更加困难.
穿过这座桥的人是否已经提供了一些建议?在性能,可伸缩性和兼容性方面,在python/R中使用稀疏矩阵的优缺点是什么?
我正在尝试使用NumPy/SciPy编写一个频谱聚类算法,用于更大(但仍易处理)的系统,利用SciPy的稀疏线性代数库.不幸的是,我遇到了eigsh()的稳定性问题.
这是我的代码:
import numpy as np
import scipy.sparse
import scipy.sparse.linalg as SLA
import sklearn.utils.graph as graph
W = self._sparse_rbf_kernel(self.X_, self.datashape)
D = scipy.sparse.csc_matrix(np.diag(np.array(W.sum(axis = 0))[0]))
L = graph.graph_laplacian(W) # D - W
vals, vects = SLA.eigsh(L, k = self.k, M = D, which = 'SM', sigma = 0, maxiter = 1000)
Run Code Online (Sandbox Code Playgroud)
该sklearn库引用scikit-learn包,特别是用于从稀疏SciPy矩阵计算图拉普拉斯的方法.
_sparse_rbf_kernel是我编写的用于计算数据点的成对亲和力的方法.它通过从图像数据创建稀疏亲和度矩阵来操作,特别是通过仅计算每个像素周围的8个邻域的成对亲和力(而不是使用scikit-learn rbf_kernel方法对所有像素成对,对于记录也不能解决这个问题) .
由于拉普拉斯非标准化,我正在寻找系统的最小特征值和相应的特征向量.我知道ARPACK不适合寻找小的特征值,但我试图使用shift-invert来找到这些值,但仍然没有取得多大成功.
使用上述参数(具体而言sigma = 0),我收到以下错误:
RuntimeError: Factor is exactly singular
Run Code Online (Sandbox Code Playgroud)
有了sigma = 0.001 …
假设我有一个CSR格式的矩阵,将行(或行)设置为零的最有效方法是什么?
以下代码运行缓慢:
A = A.tolil()
A[indices, :] = 0
A = A.tocsr()
Run Code Online (Sandbox Code Playgroud)
我不得不转换为scipy.sparse.lil_matrix因为CSR格式似乎既不支持花哨的索引,也不支持将值设置为切片.
问题:如何根据列表中的值将1个稀疏矩阵拆分为2?
也就是说,我有一个稀疏矩阵X:
>>print type(X)
<class 'scipy.sparse.csr.csr_matrix'>
Run Code Online (Sandbox Code Playgroud)
我在脑海中将其视为列表列表,如下所示:
>>print X.todense()
[[1,3,4]
[3,2,2]
[4,8,1]]
Run Code Online (Sandbox Code Playgroud)
我有一个如下所示的列表y:
y = [-1,
3,
-4]
Run Code Online (Sandbox Code Playgroud)
我如何X分成两个稀疏矩阵,取决于相应的值y是正还是负?例如,我怎样才能得到:
>>print X_pos.todense()
[[3,2,2]]
>>print X_neg.todense()
[[1,3,4]
[4,8,1]]
Run Code Online (Sandbox Code Playgroud)
结果(X_pos和X_neg)也应该是稀疏矩阵,因为它只是将稀疏矩阵拆分开始.
谢谢!
例如,
A = [ -1 0 -2 0 0
2 8 0 1 0
0 0 3 0 -2
0 -3 2 0 0
1 2 0 0 -4];
Run Code Online (Sandbox Code Playgroud)
如何获得每行的第一个非零元素的向量?
假设给出了一个上三角整数矩阵.在Java中存储它的最佳方法是什么?天真的2d int数组显然效率不高.我提出的解决方案已移至答案部分.
最近当我在CUDA TOOLKIT 6.5中使用cuSparse和cuBLAS进行稀疏矩阵乘法时,我发现cuSPARSE在所有情况下都比cuBLAS慢得多!
在我的所有实验中,我cusparseScsrmm在cuSparse和cublasSgemmcuBLAS中使用过.在稀疏矩阵中,总元素的一半为零.我使用的GPU是NVIDIA Titan Black.此外,所有消耗的时间都是nvvp通过NVIDIA提供的工具获得的.以下是一些结果:
实验A:
实验B:
所以,看到上面列出的结果是很奇怪的.因为cuSPARSE专门用于处理稀疏矩阵操作,所以它怎么能比cuBLAS更慢!?如果是这样,则根本不需要使用cuSPARSE.你能告诉我结果的任何解释吗?另外,你能否提出任何其他方法来加速稀疏矩阵乘法?
我不知道这是否是可能的,而且是可能幼稚的问题,但我怎么能集R的相当于rownames()和colnames()一个scipy.sparse.csr.csr_matrix?
我看到这my_matrix.dtype.names在这里不起作用,我找不到这种稀疏矩阵的任何"索引"等价物......
此外,pandas.sparse.*由于一些未解决的问题,这里不是一个选择......
非常感谢你的帮助,
我有使用numpy数组的矩阵乘法矩阵示例:
import numpy as np
m = np.array([[1,2,3],[4,5,6],[7,8,9]])
c = np.array([0,1,2])
m * c
array([[ 0, 2, 6],
[ 0, 5, 12],
[ 0, 8, 18]])
Run Code Online (Sandbox Code Playgroud)
如果m是scipy稀疏CSR矩阵,我怎么能做同样的事情?这会导致尺寸不匹配:
sp.sparse.csr_matrix(m)*sp.sparse.csr_matrix(c)
Run Code Online (Sandbox Code Playgroud)