gpt4 book ai didi

python - 创建稀疏零均值随机矩阵

转载 作者:行者123 更新时间:2023-12-01 02:22:29 27 4
gpt4 key购买 nike

是否有人有创建稀疏矩阵的经验,其中非零值遵循 [-0.5, 0.5] 的均匀分布,并且在 python 中具有零均值(零中心)(例如使用 Scipy.sparse)?

我知道 scipy.sparse 包提供了一些创建随机稀疏矩阵的方法,例如“rand”和“random”。但是我无法用这些方法实现我想要的。例如,我尝试过:

import numpy as np
import scipy.sparse as sp

s = np.random.uniform(-0.5,0.5)
W=sp.random(1024, 1024, density=0.01, format='csc', data_rvs=s)
<小时/>

具体说明我的想法:假设我想要上面提到的非稀疏或密集矩阵,我将通过以下方式创建它:

dense=np.random.rand(1024,1024)-0.5

'np.random.rand(1024,1024)' 将创建一个稠密均匀矩阵,其值在 [0,1] 中。为了使其均值为零,我通过减去 0.5 将矩阵居中。

但是,如果我创建一个稀疏矩阵,可以说:

sparse=sp.rand(1024,1024,density=0.01, format='csc')

矩阵将具有统一 [0,1] 的非零值。但是,如果我想将矩阵居中,我不能简单地执行“sparse-=0.5”,这将导致所有最初为零的条目在减法后变为非零。

那么,如何才能实现与上述稀疏矩阵上的密集矩阵示例相同的效果?

感谢您的帮助!

最佳答案

data_rvs 参数需要一个具有大小的“可调用”参数。从文档中来看,这一点并不明显。这可以通过 lambda 来完成,如下所示:

import numpy as np
import scipy.sparse as sp

W = sp.random(1024, 1024, density=0.01, format='csc',
data_rvs=lambda s: np.random.uniform(-0.5, 0.5, size=s))

然后 print(W) 给出:

  (243, 0)  -0.171300809713
(315, 0) 0.0739590145626
(400, 0) 0.188151369316
(440, 0) -0.187384896218
: :
(1016, 0) 0.29262088084
(156, 1) -0.149881296136
(166, 1) -0.490405135834
(191, 1) 0.188167190147
(212, 1) 0.0334533020488
: :
(411, 1) 0.122330200832
(431, 1) -0.0494334160833
(813, 1) -0.0076379249885
(828, 1) 0.462807265425
: :
(840, 1021) 0.456423017883
(12, 1022) -0.47313075329
: :
(563, 1022) -0.477190349161
(655, 1022) -0.460942546313
(673, 1022) 0.0930207181126
(676, 1022) 0.253643616387
: :
(843, 1023) 0.463793903168
(860, 1023) 0.454427252782

对于新手来说,lambda 可能看起来很奇怪 - 这只是一个未命名的函数。 sp.random 函数采用可选参数 data_rvs ,默认为 None 。指定后,它应该是一个接受大小参数并返回该数量的随机数的函数。执行此操作的一个简单函数是:

def generate_n_uniform_randoms(n):
return np.uniform(-0.5, 0.5, n)

我不知道 API 的起源,但不需要形状,因为 sp.random 可能首先计算出哪些索引将非零,然后它只需要计算这些索引的随机值,这是一个一组已知大小。

lambda 只是语法糖,它允许我们根据其他函数调用来内联定义该函数。我们可以改为写

W = sp.random(1024, 1024, density=0.01, format='csc', 
data_rvs=generate_n_uniform_randoms)

实际上,这可以是一个“可调用” - f 为其返回 f(n) 随机变量的某个对象。这可以是一个函数,但也可以是实现 n 函数的类的对象。例如:

class ufoo(object):

def __call__(self, n):
import numpy
return numpy.random.uniform(-0.5, 0.5, n)

W = sp.random(1024, 1024, density=0.01, format='csc',
data_rvs=ufoo())

如果您需要平均值恰好为零(当然在舍入范围内),可以通过从非零值中减去平均值来完成,正如我上面提到的:

W.data -= np.mean(W.data)

然后:

W[idx].mean()

-2.3718641632430623e-18

关于python - 创建稀疏零均值随机矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47804632/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com