SciPy 稀疏矩阵教程非常好 - 但它实际上留下了切片un(der)开发的部分(仍然是大纲形式 - 参见章节:"处理稀疏矩阵").
一旦这个问题得到解答,我会尝试更新教程.
我有一个大的稀疏矩阵 - 目前采用dok_matrix格式.
import numpy as np
from scipy import sparse
M = sparse.dok_matrix((10**6, 10**6))
Run Code Online (Sandbox Code Playgroud)
对于各种方法,我希望能够切割列,而对于其他我希望切片行.理想情况下,我会使用高级索引(即布尔向量bool_vect)来对稀疏矩阵进行切片M- 如下所示:
bool_vect = np.arange(10**6)%2 # every even index
out = M[bool_vect,:] # Want to select every even row
Run Code Online (Sandbox Code Playgroud)
要么
out = M[:,bool_vect] # Want to select every even column
Run Code Online (Sandbox Code Playgroud)
首先,dok_matrices不支持这个 - 但我认为如果我第一次转向lil_matrices,它会缓慢地工作 sparse.lil_matrix(M)
至于我可以从教程中收集 - 切片列我想使用CSC并切片行我想要切片CSR.那么这是否意味着我应该M通过以下方式投射矩阵:
M.tocsc()[:,bool_vect]
Run Code Online (Sandbox Code Playgroud)
要么
M.tocsr()[bool_vect,:]
Run Code Online (Sandbox Code Playgroud)
我有点猜测,因为它,我的代码很慢.任何了解其工作原理的人的帮助都会受到赞赏.提前致谢.
如果事实证明我不应该使用布尔数组索引我的矩阵,而是使用整数(索引)列表 - 这也是我很乐意找到的东西.哪个更有效率.
最后 - 这是一个很大的矩阵,如果这可以在广播中发生,那么奖励积分.
我一直在比较Python和R的几个PCA实现的性能,并注意到一个有趣的行为:
虽然在Python中计算稀疏矩阵的PCA似乎是不可能的(唯一的方法是scikit-learn的 TruncatedSVD,但它确实如此)不支持平均居中要求等同于PCA的协方差解决方案.他们的论证是,它会破坏矩阵的稀疏性.其他实现如Facebook的PCA算法或scikit中的PCA/randomPCA方法学习不支持稀疏矩阵出于类似的原因.
虽然所有这些对我来说都是有意义的,但是几个R包,如irlba,rsvd等,能够处理稀疏矩阵(例如生成rsparsematrix),甚至允许特定的center=True参数.
我的问题是,R如何在内部处理它,因为它似乎比类似的Python实现更有效.R是否仍然通过绝对缩放来保持稀疏性(这理论上会伪造结果,但至少保持稀疏性)?或者有没有任何方法可以明确地为零值存储均值,并且只存储一次(而不是分别存储每个值)?
为了得到推迟:R内部如何存储具有均值中心的矩阵而不会爆炸RAM使用.希望足够简洁....
是否可以确定scipy.sparse矩阵的字节大小?在NumPy中,您可以通过执行以下操作来确定数组的大小:
import numpy as np
print(np.zeros((100, 100, 100).nbytes)
8000000
Run Code Online (Sandbox Code Playgroud) 我正在将具有两列(A和B)的记录列表转换为矩阵表示.我一直在使用pandas中的pivot函数,但结果却相当大.pandas是否支持转换为稀疏格式?我知道我可以转动它然后把它变成某种稀疏表示,但不像我想的那样优雅.我的最终目标是将其用作预测模型的输入.
或者,在熊猫之外是否存在某种稀疏枢轴能力?
编辑:这是一个非稀疏数据透视的示例
import pandas as pd
frame=pd.DataFrame()
frame['person']=['me','you','him','you','him','me']
frame['thing']=['a','a','b','c','d','d']
frame['count']=[1,1,1,1,1,1]
frame
person thing count
0 me a 1
1 you a 1
2 him b 1
3 you c 1
4 him d 1
5 me d 1
frame.pivot('person','thing')
count
thing a b c d
person
him NaN 1 NaN 1
me 1 NaN NaN 1
you 1 NaN 1 NaN
Run Code Online (Sandbox Code Playgroud)
这创建了一个矩阵,可以包含所有可能的人和事物的组合,但它并不稀疏.
http://docs.scipy.org/doc/scipy/reference/sparse.html
稀疏矩阵占用的空间较少,因为它们可能意味着NaN或0之类的东西.如果我有一个非常大的数据集,这个旋转函数可以生成一个由于大量NaN或0而应该稀疏的矩阵.我希望通过生成一些稀疏的东西而不是创建一个密集矩阵然后将其转换为稀疏来节省大量空间/内存.
我想编写一个函数来规范化大型稀疏矩阵的行(使它们总和为1).
from pylab import *
import scipy.sparse as sp
def normalize(W):
z = W.sum(0)
z[z < 1e-6] = 1e-6
return W / z[None,:]
w = (rand(10,10)<0.1)*rand(10,10)
w = sp.csr_matrix(w)
w = normalize(w)
Run Code Online (Sandbox Code Playgroud)
但是,这会产生以下异常:
File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 325, in __div__
return self.__truediv__(other)
File "/usr/lib/python2.6/dist-packages/scipy/sparse/compressed.py", line 230, in __truediv__
raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)
有没有相当简单的解决方案?我看过这个,但我还不清楚如何实际进行分组.
我在scikit-learn 封装中使用截断的SVD .
在SVD的定义中,原始矩阵阿被approxmated作为产品甲 ≈ UΣV*其中ù和V具有正交列,并且Σ是非负对角线.
我需要得到U,Σ和V*矩阵.
看一下这里的源代码,我发现调用后V*存储在self.components_字段中fit_transform.
是否有可能得到U 和Σ矩阵?
我的代码:
import sklearn.decomposition as skd
import numpy as np
matrix = np.random.random((20,20))
trsvd = skd.TruncatedSVD(n_components=15)
transformed = trsvd.fit_transform(matrix)
VT = trsvd.components_
Run Code Online (Sandbox Code Playgroud) 在python中是否支持稀疏矩阵?
可能是numpy还是scipy?
我试图找出在python中找到稀疏对称和实矩阵行列式的最快方法.使用scipy sparse模块,但真的很惊讶没有行列式功能.我知道我可以使用LU分解来计算行列式,但是没有看到一个简单的方法来执行它,因为返回scipy.sparse.linalg.splu是一个对象并且实例化一个密集的L和U矩阵是不值得的 - 我不妨sp.linalg.det(A.todense())在哪里做A我的scipy稀疏矩阵.
我也有点惊讶为什么其他人没有面对scipy中有效决定因素计算的问题.如何使用splu计算行列式?
我看着pySparse和scikits.sparse.chlmod.后者对我来说现在不实用 - 需要软件包安装,也不确定在我遇到麻烦之前代码的速度有多快.有解决方案吗 提前致谢.
我有一个涉及非常稀疏的大型n维数组的应用程序.scipy.sparse有一个有用的'矢量化获取和设置'功能,因此可以使用Cython快速填充稀疏矩阵.
当然,scipy包不能处理n维.我发现有两个包在python sparray和.d中进行n维稀疏数组ndsparse.然而,它似乎既没有矢量化的获取和设置功能.
所以我需要:
为了我的目的,我认为将n维坐标映射回1或2维可能有效.更好的是有一个dict等价物,我可以在Cython循环内快速访问.我认为这排除了python dict.
想知道是否有人可以给我一个如何在Cython中使用c ++地图对象的例子?
稀疏张量与它们自身或密集张量的相乘似乎在TensorFlow中不起作用.以下示例
from __future__ import print_function
import tensorflow as tf
x = tf.constant([[1.0,2.0],
[3.0,4.0]])
y = tf.SparseTensor(indices=[[0,0],[1,1]], values=[1.0,1.0], shape=[2,2])
z = tf.matmul(x,y)
sess = tf.Session()
sess.run(tf.initialize_all_variables())
print(sess.run([x, y, z]))
Run Code Online (Sandbox Code Playgroud)
失败并显示错误消息
TypeError: Input 'b' of 'MatMul' Op has type string that does not match type
float32 of argument 'a'
Run Code Online (Sandbox Code Playgroud)
两个张量都具有float32类型的值,通过在没有乘法运算的情况下对它们进行求值来看.y与其自身的乘法返回类似的错误消息.x与其自身的乘法运行良好.
sparse-matrix ×10
python ×9
scipy ×7
numpy ×3
scikit-learn ×3
cython ×1
indexing ×1
pandas ×1
pca ×1
r ×1
slice ×1
sparse-array ×1
svd ×1
tensorflow ×1