在了解了在R中使用稀疏矩阵的选项之后,我想使用Matrix包从以下数据框创建稀疏矩阵,并使所有其他元素都是NA.
s r d
1 1089 3772 1
2 1109 190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109 38 7
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下内容创建一个稀疏矩阵,像往常一样访问元素:
> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0
Run Code Online (Sandbox Code Playgroud)
但如果我想将默认值设为NA,我尝试了以下内容:
M <- Matrix(NA,max(s),max(r),sparse=TRUE)
for (i in 1:nrow(X))
M[s[i],r[i]] <- d[i]
Run Code Online (Sandbox Code Playgroud)
并得到了这个错误
Error in checkSlotAssignment(object, name, value) :
assignment of an object of class "numeric" is not valid for …Run Code Online (Sandbox Code Playgroud) 我需要以某种方式在磁盘上存储512 ^ 3阵列,我目前正在使用HDF5.由于阵列稀疏,因此浪费了大量磁盘空间.
HDF5是否为稀疏阵列提供任何支持?
我正在寻找一个可以在Ruby中使用的稀疏矩阵库.我目前正在使用由"gsl"gem提供的GNU Scientific Library绑定,但如果我使用专用的稀疏矩阵库,我的应用程序将更好地优化.我调查了linalg和NArray库.这三个库中没有一个支持稀疏矩阵优化的存储或操作.
有没有我错过的东西 - 或者现有的C库可能可以编写绑定?我更喜欢前者,后者,因为我之前没有在Ruby中编写C绑定,但我愿意尝试它.
我正在尝试用Python编写一个函数(仍然是一个noob!),它返回由tfidf分数的内积所排序的索引和分数.程序是:
idx和所有其他文档之间计算内部产品的向量我目前的代码是:
import h5py
import numpy as np
def get_related(tfidf, idx) :
''' return the top documents '''
# calculate inner product
v = np.inner(tfidf, tfidf[idx].transpose())
# sort
vs = np.sort(v.toarray(), axis=0)[::-1]
scores = vs[1:,]
# sort indices
vi = np.argsort(v.toarray(), axis=0)[::-1]
idxs = vi[1:,]
return (scores, idxs)
Run Code Online (Sandbox Code Playgroud)
这里tfidf是一个sparse matrix of type '<type 'numpy.float64'>'.
这似乎效率低下,因为排序执行了两次(sort()然后argsort()),结果必须反过来.
toarray()吗?我有一个大矩阵,我想转换为稀疏的CSR格式.
当我做:
import scipy as sp
Ks = sp.sparse.csr_matrix(A)
print Ks
Run Code Online (Sandbox Code Playgroud)
A密集,我得到
(0, 0) -2116689024.0
(0, 1) 394620032.0
(0, 2) -588142656.0
(0, 12) 1567432448.0
(0, 14) -36273164.0
(0, 24) 233332608.0
(0, 25) 23677192.0
(0, 26) -315783392.0
(0, 45) 157961968.0
(0, 46) 173632816.0
Run Code Online (Sandbox Code Playgroud)
等等...
我可以使用以下方法获取行索引,列索引和值的向量:
Knz = Ks.nonzero()
sparserows = Knz[0]
sparsecols = Knz[1]
#The Non-Zero Value of K at each (Row,Col)
vals = np.empty(sparserows.shape).astype(np.float)
for i in range(len(sparserows)):
vals[i] = K[sparserows[i],sparsecols[i]]
Run Code Online (Sandbox Code Playgroud)
但是有可能提取稀疏CSR格式(值,列索引,行指针)中所包含的向量吗?
SciPy的文档解释了可以从这三个向量生成CSR矩阵,但我想做相反的事情,将这三个向量输出.
我错过了什么?
谢谢你的时间!
我正在寻找一个库来处理fortran 90/95中的稀疏矩阵.我只需要非常基本的操作,如矩阵向量乘法.你建议我用什么?
我已经搜索过了一个扩展名(?)到BLAS,称为"稀疏blas",在爆炸技术论坛规范的第3章中有记录:
http://www.netlib.org/blas/blast-forum/ ,
看起来很理想 根据该文档,库应该有一个fortran 95接口.但是,我无法在任何可以下载的地方找到该规范的实际实现.我有点认为fortran 95稀疏blas规范并没有在任何地方真正实现?反正不是开源的.
我还找到了一个名为sparsekit的库:
http://people.sc.fsu.edu/~jburkardt/f_src/sparsekit/sparsekit.html
任何人都有这两个中的任何一个的经验,或任何其他稀疏矩阵库为fortran 90/95?我想建议使用哪一个,以及从哪里获取它(在sparsekit的情况下,源代码可通过上面的链接获得).对于稀疏矩阵,有没有类似"标准"的东西,比如BLAS用于密集矩阵?
干杯,
阿恩
我们可以从与所述非零元素的索引,并且值构造一个稀疏矩阵sparseMatrix或spMatrix.有没有函数将稀疏矩阵转换回索引和所有非零元素的值?例如
i <- c(1,3,5); j <- c(1,3,4); x <- 1:3
A <- sparseMatrix(i, j, x = x)
B <- sparseToVector(A)
## test case:
identical(B,cbind(i,j,x))
Run Code Online (Sandbox Code Playgroud)
是否有任何功能做类似的工作sparseToVector?
我正在研究data.frame看起来很有用的glm功能,所以我决定我会对模型矩阵的稀疏重复进行处理,这样我就可以把这个稀疏矩阵放到glmnet函数中了.但sparse.model.matrix看起来要从原始矩阵中删除一些行.知道为什么会这样,以及任何解决方案如何避免这种情况?代码如下:
> mm <- sparse.model.matrix(~clicks01+kl_tomek*bc1+hours+plec+1,
data = daneOst)
> dim(mm)
[1] 1253223 292
> dim(daneOst)
[1] 1258836 6
Run Code Online (Sandbox Code Playgroud) 我试图在巨大的稀疏矩阵上应用PCA,在下面的链接中它说sklearn的randomizedPCA可以处理scipy稀疏格式的稀疏矩阵. 在非常大的稀疏矩阵上应用PCA
但是,我总是得到错误.有人可以指出我做错了什么.
输入矩阵'X_train'包含float64中的数字:
>>>type(X_train)
<class 'scipy.sparse.csr.csr_matrix'>
>>>X_train.shape
(2365436, 1617899)
>>>X_train.ndim
2
>>>X_train[0]
<1x1617899 sparse matrix of type '<type 'numpy.float64'>'
with 81 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)
我想做:
>>>from sklearn.decomposition import RandomizedPCA
>>>pca = RandomizedPCA()
>>>pca.fit(X_train)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/decomposition/pca.py", line 567, in fit
self._fit(check_array(X))
File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 334, in check_array
copy, force_all_finite)
File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 239, in _ensure_sparse_format
raise TypeError('A sparse matrix was passed, but dense '
TypeError: …Run Code Online (Sandbox Code Playgroud) 我正在尝试计算几个 (5-500) 特征向量,这些特征向量对应于大型对称方形稀疏矩阵(高达 30000x30000)的最小特征值,其中非零值小于 0.1%。
我目前在 shift-invert 模式 (sigma=0.0) 下使用 scipy.sparse.linalg.eigsh,我通过有关该主题的各种帖子发现这是首选解决方案。但是,在大多数情况下,解决问题最多需要 1 小时。另一方面,如果我要求最大的特征值(在我的系统上为亚秒),则该函数非常快,这是文档中预期的。
由于我在工作中更熟悉 Matlab,所以我尝试在 Octave 中解决这个问题,使用 eigs (sigma=0) 在短短几秒钟内(低于 10 秒)给了我相同的结果。由于我想对包括特征向量计算在内的算法进行参数扫描,因此在 python 中也能获得这种时间增益。
我首先更改了参数(尤其是容差),但在时间尺度上并没有太大变化。
我在 Windows 上使用 Anaconda,但试图将 scipy 使用的 LAPACK/BLAS(这是一个巨大的痛苦)从 mkl(默认 Anaconda)切换到 OpenBlas(根据文档由 Octave 使用),但看不到变化表现。
我无法弄清楚,使用的 ARPACK 是否有改变(以及如何改变)?
我将以下代码的测试用例上传到以下 dropbox 文件夹:https ://www.dropbox.com/sh/l6aa6izufzyzqr3/AABqij95hZOvRpnnjRaETQmka?dl =0
在 Python 中
import numpy as np
from scipy.sparse import csr_matrix, csc_matrix, linalg, load_npz
M = load_npz('M.npz')
evals, evecs = linalg.eigsh(M,k=6,sigma=0.0)
Run Code Online (Sandbox Code Playgroud)
在八度:
M=dlmread('M.txt');
M=spconvert(M);
[evecs,evals] = eigs(M,6,0);
Run Code Online (Sandbox Code Playgroud)
任何帮助是appriciated !
我根据评论和建议尝试了一些其他选项:
Octave:
eigs(M,6,0)并eigs(M,6,'sm') …