我的MatrixR 稀疏,显然对我来说太大as.matrix()了(虽然它也不是超大).有as.matrix()问题的调用是在svd()函数内部,所以我想知道是否有人知道不需要先转换为密集矩阵的SVD的不同实现.
可以使用布尔数组索引NumPy数组,以选择与True条目对应的行:
>>> X = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> rows = np.array([True,False,True])
>>> X[rows]
array([[1, 2, 3],
[7, 8, 9]])
>>> X[np.logical_not(rows)]
array([[4, 5, 6]])
Run Code Online (Sandbox Code Playgroud)
但是,对于SciPy稀疏矩阵来说,这似乎是不可能的; 索引被视为数字索引,因此False选择第0行并True选择第1行.如何获得类似NumPy的行为?
我有一个稀疏矩阵类,它的非零和相应的列索引按行顺序存储在基本上类似STL-vector的容器中.他们可能有未使用的容量,如矢量; 要插入/删除元素,必须移动现有元素.
说我有手术insert_erase_replace,或ier简称.ier给定位置p,列索引j和值,可以执行以下操作v:
v==0,ier删除条目p并左移所有后续条目.v!=0和j已经存在的p,ier在替换单元格内容p有v.v!=0,并且j不存在p,ier则在右移所有后续条目后插入条目v和列索引.jp所以这一切都是微不足道的.
现在让我说我有ier2,它做了同样的事情,除了它采用包含多个列索引j和相应值的列表v.它还有一个大小n,表示列表中存在多少个索引/值对.但由于向量仅存储非零,有时实际插入大小小于n.
仍然微不足道.
但现在让我说我有ier3,不仅仅是一个列表ier2,而是多个列表.这表示编辑稀疏矩阵的切片.
在某些时候,迭代遍历向量,逐个复制它们并ier2在我们到达每个插入点时插入/替换/删除列表索引/值- 样式变得更有效.如果总插入大小会导致我的向量无论如何都需要调整大小,那么我们就这样做了.
鉴于我的向量比列表的总长度大得多,是否有一种算法可以有效地将列表合并到向量中?
到目前为止,这就是我所拥有的:
传递给每个列表ier3表示条目的净删除(左移),净替换(没有移动,因此便宜)或条目的净插入(右移).那里可能还有一些元素的重新安排,但昂贵的部分是净删除和净插入.
要弄清楚有效地进行网络插入或净删除的算法并不难.
当两者中的任何一个发生时,它会更难.
我唯一能想到的就是两次通过:
我有一个Scipy稀疏CSR矩阵,它是用SVM-Light格式的稀疏TF-IDF特征矩阵创建的.功能的数量是巨大的,它是稀疏的所以我必须使用SparseTensor,否则它太慢.
例如,要素数量为5,示例文件可能如下所示:
0 4:1
1 1:3 3:4
0 5:1
0 2:1
Run Code Online (Sandbox Code Playgroud)
解析后,训练集如下所示:
trainX = <scipy CSR matrix>
trainY = np.array( [0,1,00] )
Run Code Online (Sandbox Code Playgroud)
我有两个重要问题:
1)我如何有效地将其转换为SparseTensor(sp_ids,sp_weights),以便我使用查找执行快速乘法(WX):https://www.tensorflow.org/versions/master/api_docs/python/nn.html# embedding_lookup_sparse
2)如何在每个时期随机化数据集并重新计算sp_ids,sp_weights以便我可以为小批量梯度下降提供(feed_dict).
像logistic回归这样的简单模型的示例代码将非常受欢迎.图表将是这样的:
# GRAPH
mul = tf.nn.embedding_lookup_sparse(W, X_sp_ids, X_sp_weights, combiner = "sum") # W.X
z = tf.add(mul, b) # W.X + b
cost_op = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(z, y_true)) # this already has built in sigmoid apply
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost_op) # construct optimizer
predict_op = tf.nn.sigmoid(z) # sig(W.X + b)
Run Code Online (Sandbox Code Playgroud) 我有一个很大的csv文件,它列出了图中节点之间的连接.例:
0001,95784
0001,98743
0002,00082
0002,00091
所以这意味着节点id 0001连接到节点95784和98743,依此类推.我需要把它读成numpy中的稀疏矩阵.我怎样才能做到这一点?我是python的新手,所以这方面的教程也会有所帮助.
与STATS.se交叉,因为这个问题可以跨越两个STAT.se/SO https://stats.stackexchange.com/questions/17712/parallelize-solve-for-ax-b
我有一些非常大的稀疏矩阵,使用矩阵包中的spMatrix函数创建.
使用solve()函数适用于我的Ax = b问题,但需要很长时间.几天.
我注意到http://cran.r-project.org/web/packages/RScaLAPACK/RScaLAPACK.pdf 似乎有一个可以并行化解决方案功能的功能,但是,可能需要几周的时间来安装新的软件包特定服务器.
服务器已经安装了雪包.
所以
谢谢.
[编辑] - 其他细节
矩阵约为370,000 x 370,000.我用它来解决alpha中心问题,http://en.wikipedia.org/wiki/Alpha_centrality.我最初在igraph包中使用alpha中心函数,但它会崩溃R.
更多细节
我有一个scipy.sparse.csr_matrix格式的大型稀疏矩阵X,我想用一个利用并行性的numpy数组W来乘以它.经过一些研究后,我发现我需要在多处理中使用Array,以避免在进程之间复制X和W(例如:如何在Python多处理中将Pool.map与Array(共享内存)结合起来?并将共享的只读数据复制到Python多处理的不同过程?).这是我最近的尝试
import multiprocessing
import numpy
import scipy.sparse
import time
def initProcess(data, indices, indptr, shape, Warr, Wshp):
global XData
global XIndices
global XIntptr
global Xshape
XData = data
XIndices = indices
XIntptr = indptr
Xshape = shape
global WArray
global WShape
WArray = Warr
WShape = Wshp
def dot2(args):
rowInds, i = args
global XData
global XIndices
global XIntptr
global Xshape
data = numpy.frombuffer(XData, dtype=numpy.float)
indices = numpy.frombuffer(XIndices, dtype=numpy.int32)
indptr = numpy.frombuffer(XIntptr, dtype=numpy.int32)
Xr = scipy.sparse.csr_matrix((data, indices, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将以下MATLAB代码转换为Python,并且无法找到可在任何合理时间内工作的解决方案.
M = diag(sum(a)) - a;
where = vertcat(in, out);
M(where,:) = 0;
M(where,where) = 1;
Run Code Online (Sandbox Code Playgroud)
这里,a是稀疏矩阵,其中是矢量(如输入/输出).我使用Python的解决方案是:
M = scipy.sparse.diags([degs], [0]) - A
where = numpy.hstack((inVs, outVs)).astype(int)
M = scipy.sparse.lil_matrix(M)
M[where, :] = 0 # This is the slowest line
M[where, where] = 1
M = scipy.sparse.csc_matrix(M)
Run Code Online (Sandbox Code Playgroud)
但由于A是334863x334863,这需要三分钟.如果有人对如何加快速度有任何建议,请提供帮助!为了进行比较,MATLAB在不知不觉中快速完成了同样的步骤.
谢谢!
我想以HDF5格式压缩和存储一个巨大的Scipy矩阵.我该怎么做呢?我试过以下代码:
a = csr_matrix((dat, (row, col)), shape=(947969, 36039))
f = h5py.File('foo.h5','w')
dset = f.create_dataset("init", data=a, dtype = int, compression='gzip')
Run Code Online (Sandbox Code Playgroud)
我得到这样的错误,
TypeError: Scalar datasets don't support chunk/filter options
IOError: Can't prepare for writing data (No appropriate function for conversion path)
Run Code Online (Sandbox Code Playgroud)
我无法将其转换为numpy数组,因为会有内存溢出.什么是最好的方法?