从 Python 中具有不同概率的两个高斯分布中抽样

Sampling from two Gaussian distributions with different probability in Python

我正在尝试从 2 个不同的高斯分布生成 100 个样本,这样 G1 的出现概率为 0.7,G2 的出现概率为 0.3。我有以下代码片段:

from scipy.stats import norm
import numpy as np

x = [norm.rvs(0, 1, size=5), norm.rvs(10, 1, 5)]
draw = np.random.choice([0, 1], 100, p=[0.7, 0.3])
y = [x[i].rvs() for i in draw]
z = np.array(y)

当我编译它时,出现以下错误:

AttributeError: 'numpy.ndarray' object has no attribute 'rvs'

有什么我想念的吗?或者,是否存在根本性缺陷?

在这一行

x = [norm.rvs(0, 1, size=5), norm.rvs(10, 1, 5)]

您正在创建两个随机值数组。所以在这一行

[x[i].rvs() for i in draw]

你不能使用它们来创建更多随机值 (.rvs),因为你有 numpy 数组:

norm.rvs(0, 1, size=5)

# Out: array([-1.61758314,  1.19288111, -0.55599284, -0.17926848, -0.78759   ])

您想创建一个正态分布对象列表,然后使用它从中抽取随机值:

x = [norm(0, 1), norm(10, 1)]
draw = np.random.choice([0, 1], 100, p=[0.7, 0.3])
y = [x[i].rvs() for i in draw]