numpy.random.rand和之间有什么区别numpy.random.randn?
从文档中,我知道它们之间的唯一区别来自每个数字的概率分布,但总体结构(维度)和使用的数据类型(浮点数)是相同的.由于相信这一点,我很难调试神经网络.
具体来说,我试图重新实现Michael Nielson在神经网络和深度学习书中提供的神经网络.原始代码可以在这里找到.我的实现与原始实现相同,除了我numpy.random.rand在init函数中定义和初始化权重和偏差,而不是numpy.random.randn在原始中.
但是,我random.rand用于初始化的代码weights and biases不起作用,因为网络不会学习,权重和偏差也不会改变.
两个随机函数之间的差异会导致这种奇怪吗?
我注意到,你可以把不同数量的内部numpy.random.seed(),例如numpy.random.seed(1),numpy.random.seed(101).不同的数字是什么意思?你如何选择这些数字?
我已经使用 numpy 的随机功能一段时间了,通过调用诸如np.random.choice()或np.random.randint()等方法。我现在发现了创建一个default_rng对象或其他Generator对象的能力:
from numpy.random import default_rng
gen = default_rng()
random_number = gen.integers(10)
Run Code Online (Sandbox Code Playgroud)
到目前为止我一直会使用
np.random.randint(10)
Run Code Online (Sandbox Code Playgroud)
相反,我想知道这两种方式有什么区别。
我能想到的唯一好处是跟踪多个种子,或者想要使用特定的 PRNG,但对于更通用的用例来说,也许也存在差异?
假设我想创建一个包含5个元素的列表或numpy数组,如下所示:
array = [i, j, k, l, m]
Run Code Online (Sandbox Code Playgroud)
哪里:
i 在1.5到12.4的范围内j 在0到5的范围内k 在4到16的范围内l 在3到5的范围内m 在2.4到8.9的范围内.这是一个示例,表明某些范围包括分数.什么是一个简单的方法来做到这一点?
我需要创建一个类,它接受一个随机数生成器(即一个numpy.random.RandomState对象)作为参数.在没有指定此参数的情况下,我想将它分配给numpy运行时使用的随机生成器numpy.random.<random-method>.如何访问此全局生成器?目前我这样做只是将模块对象指定为随机生成器(因为它们共享方法/鸭子类型).然而,当酸洗(无法腌制模块对象)和深度复制时,这会导致问题.我想使用numpy.random后面的RandomState对象
PS:我正在使用python-3.4
NumPy 现在建议新代码使用defacult_rng()实例而不是新代码这一事实numpy.random让我开始思考应该如何使用它来产生良好的结果,无论是性能副还是统计。
第一个例子是我最初想写的:
import numpy as np
class fancy_name():
def __init__(self):
self.rg = np.random.default_rng()
self.gamma_shape = 1.0
self.gamma_scale = 1.0
def public_method(self, input):
# Do intelligent stuff with input
return self.rg.gamma(self.gamma_shape, slef.gamma_scale)
Run Code Online (Sandbox Code Playgroud)
但我也考虑过在每个函数调用中创建一个新实例:
import numpy as np
class fancy_name():
def __init__(self):
self.gamma_shape = 1.0
self.gamma_scale = 1.0
def public_method(self, input):
# Do intelligent stuff with input
rg = np.random.default_rng()
return rg.gamma(self.gamma_shape, slef.gamma_scale)
Run Code Online (Sandbox Code Playgroud)
第三种选择是将 rng 作为函数调用中的参数传递。这样,同样的 rng 也可以用于代码的其他部分。
这用于模拟环境中,该环境将经常调用以进行采样,例如转换时间。
我想问题是这三种方法中的任何一种是否都有论据,是否存在某种实践?
此外,对使用这些随机数生成器的更深入解释的任何参考(NumPy 文档和随机采样文章除外)都非常有趣!
我希望能够在Python的标准Random和numpy的np.random.RandomState之间来回转换.这两个都使用Mersenne Twister算法,因此它应该是可能的(除非他们使用此算法的不同版本).
我开始研究这些对象的getstate/setstate和get_state/set_state方法.但我不知道如何转换它们的细节.
import numpy as np
import random
rng1 = np.random.RandomState(seed=0)
rng2 = random.Random(seed=0)
state1 = rng1.get_state()
state2 = rng2.getstate()
Run Code Online (Sandbox Code Playgroud)
检查每个州,我看到:
>>> print(state1)
('MT19937', array([0, 1, 1812433255, ..., 1796872496], dtype=uint32), 624, 0, 0.0)
>>> print(state2)
(3, (2147483648, 766982754, ..., 1057334138, 2902720905, 624), None)
Run Code Online (Sandbox Code Playgroud)
第一个状态是大小为5的元组len(state1[1]) = 624.
第二个状态是大小为3的元组len(state2[1]) = 625.似乎state2中的最后一项实际上是state1中的624,这意味着数组实际上是相同的大小.到现在为止还挺好.这些似乎相当兼容.
不幸的是,内部数字没有明显的对应关系,所以0的种子导致不同的状态,这是有道理的,因为rng1.rand() = .548和rng2.random() = .844.所以,算法似乎略有不同.
但是,我不需要它们完美对应.我只需要能够在不影响第一个状态的情况下确定性地设置一个rng的状态.
理想情况下,一旦我使用第一个的状态来设置第二个的状态,而不调用任何随机方法,然后使用第二个来设置第一个的状态,第一个状态将保持不变,但这不是一个要求.
目前我有一个黑客攻击方法,只是交换我可以从两个rng中提取的624长度列表.但是,我不确定这种方法是否存在任何问题.任何对这个问题更有见识的人都可以解释一下吗?
这是我的方法,但我不确定它是否正常工作.
np_rng = np.random.RandomState(seed=0)
py_rng = random.Random(0)
# Convert python to numpy random …Run Code Online (Sandbox Code Playgroud) 我有一个表示图像的numpy.ndarray,我想给它添加随机噪声。我已经进行了一些测试,到目前为止,我要做的最快的解决方案是:
def RandomNoise(x):
x += np.random.random(x.shape)
Run Code Online (Sandbox Code Playgroud)
但是,当我有大图像/阵列时,此解决方案仍然太慢。最快的方法是什么?