

Scipyで、非零の要素が−1.0から1.0の一様分布で、  
ランダムなスパース行列を生成したいです。

単純に、Scipyのrandを用いて

[code]

    scipy.sparse.rand(m, n)
    
[/code]

と書くと、要素は0.0から1.0の一様分布なので、  
非零の値がすべて正になってしまいます。

ランダムなスパース行列の生成の際に、  
非零要素値の上限下限を変える  
効率の良い方法はあるでしょうか？

よろしくお願いします。


CC BY-SA 3.0
2016-05-01T09:36:15.510
24488
2016-05-01T13:20:39.327
12874
question
python scipy
Scipyで、非零の要素が−1.0から1.0の一様分布で、ランダムなスパース行列を生成したい


−1.0 から 1.0 の一様分布との事ですので、以下ではどうでしょうか。`[0, 1]` なので、`ceil()` が 1.0
になることを利用しています。

[code]

    >>> import scipy.sparse as sp
    >>> r = sp.rand(100, 100)
    >>> r2 = r * 2.0 - r.ceil()
    >>> print r2
    (0, 18)  0.105084065469
    (0, 96)  -0.667551576265
    (3, 60)  0.239045542473
    (5, 38)  -0.420674130882
    (5, 87)  0.146186464011
    (6, 20)  -0.394829441002
                   :
    
[/code]


CC BY-SA 3.0
2016-05-01T12:00:28.513
24493
2016-05-01T12:00:28.513
24488
answer


`scipy.sparse.random`であれば非零要素を生成する乱数生成器を引数に渡せますので[-1,1]
の一様分布の生成器`scipy.stats.uniform(loc=-1, scale=2).rvs`をつかって．

[code]

    import scipy.stats
    import scipy.sparse
    
    rvs = scipy.stats.uniform(loc=-1, scale=2).rvs  # U(loc, loc+scale)
    x = scipy.sparse.random(10, 5, density=0.1, data_rvs=rvs)
    
[/code]

手元の結果は

[code]

    (0, 1)  -0.351716913146
    (8, 0)  -0.308927730864
    (9, 2)  0.0949004467739
    (5, 4)  0.621192454634
    (8, 4)  -0.310937542874
    
[/code]

となりました．


CC BY-SA 3.0
2016-05-01T13:20:39.327
24495
2016-05-01T13:20:39.327
14418
24488
answer