Python 在Scipy中,为什么具有统一概率的custom.rvs()只返回起始区域中的值?
如果我生成一个数组Python 在Scipy中,为什么具有统一概率的custom.rvs()只返回起始区域中的值?,python,numpy,scipy,scikit-learn,probability,Python,Numpy,Scipy,Scikit Learn,Probability,如果我生成一个数组 custom=np.ones(800, dtype=np.float32) 然后使用 custom=normalize(custom)[0] customPDF = stats.rv_discrete(name='pdfX', values=(np.arange(800), custom)) 那么如果我使用 customPDF.rvs() 我得到的返回值范围为0-20,而我期望随机数从0到800不等 下面的代码提供了所需的输出 random.uniform(0,800)
custom=np.ones(800, dtype=np.float32)
然后使用
custom=normalize(custom)[0]
customPDF = stats.rv_discrete(name='pdfX', values=(np.arange(800), custom))
那么如果我使用
customPDF.rvs()
我得到的返回值范围为0-20,而我期望随机数从0到800不等
下面的代码提供了所需的输出
random.uniform(0,800)
但是由于必须能够通过改变自定义数组来操纵概率分布,我不得不使用customPDF.rvs()
有没有解决办法或者为什么会发生这种情况
问题在于这一行:
custom=normalize(custom)[0]
根据警告,它看起来像是normalize
所指<代码>规格化需要一个[n_样本,n_特征]
二维数组-由于您给它一个1D向量,它将插入一个新维度,并将其视为[1,n_特征]
数组(因此您要为输出的第0个元素编制索引)
默认情况下,它会将每行要素的长度调整为1。这与将元素总和设为1不同:
print(normalize(np.ones(800))[0].sum())
# 28.2843
由于custom
的和远大于1,因此在概率向量结束之前,绘制特定整数的累积概率达到1:
print(custom.cumsum().searchsorted(1))
# 28
其结果是,您永远不会绘制大于28的整数:
print(customPDF.rvs(size=100000).max())
# 28
为了规范化自定义
您应该做的是除以其总和:
custom /= custom.sum()
# or alternatively:
custom = np.repeat(1./800, 800)
问题在于这一行:
custom=normalize(custom)[0]
根据警告,它看起来像是normalize
所指<代码>规格化需要一个[n_样本,n_特征]
二维数组-由于您给它一个1D向量,它将插入一个新维度,并将其视为[1,n_特征]
数组(因此您要为输出的第0个元素编制索引)
默认情况下,它会将每行要素的长度调整为1。这与将元素总和设为1不同:
print(normalize(np.ones(800))[0].sum())
# 28.2843
由于custom
的和远大于1,因此在概率向量结束之前,绘制特定整数的累积概率达到1:
print(custom.cumsum().searchsorted(1))
# 28
其结果是,您永远不会绘制大于28的整数:
print(customPDF.rvs(size=100000).max())
# 28
为了规范化自定义
您应该做的是除以其总和:
custom /= custom.sum()
# or alternatively:
custom = np.repeat(1./800, 800)
请添加您的导入。您正在使用几个不知从何而来的函数。请添加您的导入。您正在使用一些不知从何而来的函数。