Python中的稀疏随机矩阵,其范围不同于[0,1]

ada*_*key 4 python random scipy sparse-matrix

我需要在Python中生成一个稀疏的随机矩阵,其中所有值都在[-1,1]均匀分布的范围内.最有效的方法是什么?

我有一个基本的稀疏随机矩阵:

from scipy import sparse
from numpy.random import RandomState

p = sparse.rand(10, 10, 0.1, random_state=RandomState(1))
Run Code Online (Sandbox Code Playgroud)

这给了我价值观[0,1]:

print p
  (0, 0)    0.419194514403
  (0, 3)    0.0273875931979
  (1, 4)    0.558689828446
  (2, 7)    0.198101489085
  (3, 5)    0.140386938595
  (4, 1)    0.204452249732
  (4, 3)    0.670467510178
  (8, 1)    0.878117436391
  (9, 0)    0.685219500397
  (9, 3)    0.417304802367
Run Code Online (Sandbox Code Playgroud)

最好有一个就地解决方案或不需要将其吹到完整矩阵的东西,因为在实践中我将使用非常大的尺寸.令我惊讶的是,没有一些快速参数可供sparse.rand自己设定.

Eri*_*elt 5

看起来你想要的功能是在两个月前添加的,将在scipy 0.16中提供:https://github.com/scipy/scipy/blob/77af8f44bef43a67cb14c247bc230282022ed0c2/scipy/sparse/construct.py#L671

你将能够调用sparse.random(10, 10, 0.1, random_state=RandomState(1), data_fvs=func),其中func "应采取一个参数指定ndarray它会返回.稀疏随机矩阵的结构的非零项将从该函数采样的阵列要采取的长度".因此,您将能够提供任意分布样本.

现在,你可以通过将p乘以标量N来至少将均匀分布拉伸到[0,N]:

>>> print 2*p

(0, 0)  0.838389028807
(9, 0)  1.37043900079
(4, 1)  0.408904499463
(8, 1)  1.75623487278
(0, 3)  0.0547751863959
(4, 3)  1.34093502036
(9, 3)  0.834609604734
(1, 4)  1.11737965689
(3, 5)  0.28077387719
(2, 7)  0.39620297817
Run Code Online (Sandbox Code Playgroud)

你不能添加标量,但是作为一个黑客,你可以创建一个稀疏矩阵,其中所有的元素都在非零元素中,p.ceil()因为p的所有元素都是在[0,1]内生成的.然后将均匀分布转换为[-1,1]即可

 print 2*p - p.ceil()

(0, 0)  -0.161610971193
(0, 3)  -0.945224813604
(1, 4)  0.117379656892
(2, 7)  -0.60379702183
(3, 5)  -0.71922612281
(4, 1)  -0.591095500537
(4, 3)  0.340935020357
(8, 1)  0.756234872782
(9, 0)  0.370439000794
(9, 3)  -0.165390395266
Run Code Online (Sandbox Code Playgroud)

所以一般来说,如果你需要一些间隔[a,b],只需执行:

p = (b - a)*p + a*p.ceil()
Run Code Online (Sandbox Code Playgroud)

我目前看不到更好的解决方案,而不是编写自己的构造函数sparse.rand,但我很想知道是否有人知道如何绕过ceil()黑客.