背景
今天在学习强化学习老虎机问题时,遇到一个概率初始化的函数np.random.uniform():
# 伯努利分布
class BernoulliBandit:
"""
输入k表示拉杆个数
"""
def __init__(self, k):
self.probs = np.random.uniform(size=k) # 拉杆获奖随机概率
self.best_idx = np.argmax(self.probs) # 获奖概率最大的拉杆
self.best_prob = self.probs[self.best_idx] # 最大的获奖概率
self.k = k
def step(self, k):
# 当玩家选择了k号拉杆之后,根据拉动该老虎机的k号拉杆获得奖励的概率返回1或0
if np.random.rand() < self.probs[k]:
return 1
else:
return 0
函数文档解释
该函数是在一个均匀分布的区域内随机采样的用法,采取英文的形容词意义
uniform:[adjective] : the same; not changing or different in any way 相同的,一律的;整齐划一的
np.random.uniform(low=0.0, high=1.0, size=None)
- low:下边界,default:0.0
- high:上边界,default:1.0
- size:输出样本数目,可接受的类型:int,tuple,optional,default:1
low和high构成采样的数值区域,size为返回的样本数目规则,返回的为numpy数组类型。
low和high都很好理解,size输入为int型的时候也非常号理解。但是我们拓展一下,当size接受的参数为元组或者列表时的使用方法,以及他们的应用场景。
输入为元组时
import numpy as np
print(np.random.uniform(-1,0,(2,2,2)))
- 打印结果为:
[[[-0.04009406 -0.77775586]
[-0.637332 -0.9164117 ]]
[[-0.57846188 -0.83553459]
[-0.36930931 -0.25702568]]]
从打印结果来看生成了一个三维的numpy数组,所以size的输入限制与numpy中大部分的输入限制一致,size控制返回值的形状,一个不太严谨的说法,可以参考shape函数,size接受的传参与shape函数的返回值相同。
输入为列表时
import numpy as np
list_test = [1,2,3,4]
print(np.random.uniform(-1,0,(list_test)))
- 打印结果为
[[[[-0.96323452 -0.47379732 -0.57836554 -0.44094077]
[-0.94600037 -0.99985624 -0.93022862 -0.34152617]
[-0.45889516 -0.52943953 -0.22264047 -0.02619466]]
[[-0.68887426 -0.69572285 -0.79245117 -0.12428877]
[-0.40592559 -0.66175123 -0.12628185 -0.00289007]
[-0.97452254 -0.96072257 -0.66153463 -0.59955725]]]]
使用了list储存的维度信息,返回的同样是根据list的维度信息的numpy数组,与元组的类似,其可接受的参数与shape返回的形状中的数值也是相同的
在需要高维度的初始化数据时,这个函数对于生成numpy数组便非常的好用