Python 中是否有函数根据概率分布给出输出?
Is there a function in Python which gives an output based on a probability distribution?
我有一个数字数组,比如从 0 到 8,这些数字可能会在数组中重复出现。
我需要从中选择一个数字,一个数字出现的概率应该与它在该数组中出现的次数成正比。
这是原始数组:
([7, 0, 7, 8, 4, 4, 6, 5, 2, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8])
这是包含每个数字在数组中出现次数的数组:
array([ 2., 1., 3., 1., 1., 4., 1., 5., 1.])
这是我在其中尝试以我之前描述的方式获取一个索引(deg)的代码
tot = sum((deg))
n = np.random.uniform(0, tot)
for i in range(len(deg)):
if n < deg[i]:
return i
n = n - deg[i]
return i
我得到了一个索引 2,但我不知道这个过程在概率上是否正确。你说呢?
您可以简单地在原始输入上使用 random.choice
。由于 selected 索引是均匀分布的,因此选择元素的概率将自动与出现次数成正比。无需计算 deg
.
正如评论中所指出的,您还可以选择使用 random.choices
,这不仅可以让您收集多个有放回的样本,还可以让您手动分配每个元素的比例。
例如,对于给定的种子,以下三个输入应该 select 相同的三个元素:
x = [1, 2, 3, 2, 7, 7, 7, 7]
y = [1, 2, 3, 7]
z = [1, 2, 1, 4]
w = [0.125, 0.25, 0.125, 0.5]
random.choices(x, k=3)
random.choices(y, weights=z, k=3)
random.choices(y, weights=w, k=3)
要从 x
到 y
和 z
,请使用 collections.Counter
:
c = collections.Counter(x)
y, z = map(list, zip(*c.items()))
我有一个数字数组,比如从 0 到 8,这些数字可能会在数组中重复出现。 我需要从中选择一个数字,一个数字出现的概率应该与它在该数组中出现的次数成正比。
这是原始数组:
([7, 0, 7, 8, 4, 4, 6, 5, 2, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8])
这是包含每个数字在数组中出现次数的数组:
array([ 2., 1., 3., 1., 1., 4., 1., 5., 1.])
这是我在其中尝试以我之前描述的方式获取一个索引(deg)的代码
tot = sum((deg))
n = np.random.uniform(0, tot)
for i in range(len(deg)):
if n < deg[i]:
return i
n = n - deg[i]
return i
我得到了一个索引 2,但我不知道这个过程在概率上是否正确。你说呢?
您可以简单地在原始输入上使用 random.choice
。由于 selected 索引是均匀分布的,因此选择元素的概率将自动与出现次数成正比。无需计算 deg
.
正如评论中所指出的,您还可以选择使用 random.choices
,这不仅可以让您收集多个有放回的样本,还可以让您手动分配每个元素的比例。
例如,对于给定的种子,以下三个输入应该 select 相同的三个元素:
x = [1, 2, 3, 2, 7, 7, 7, 7]
y = [1, 2, 3, 7]
z = [1, 2, 1, 4]
w = [0.125, 0.25, 0.125, 0.5]
random.choices(x, k=3)
random.choices(y, weights=z, k=3)
random.choices(y, weights=w, k=3)
要从 x
到 y
和 z
,请使用 collections.Counter
:
c = collections.Counter(x)
y, z = map(list, zip(*c.items()))