使用 scipy 从 pdf 中选择随机值

Posted

技术标签:

【中文标题】使用 scipy 从 pdf 中选择随机值【英文标题】:Selecting random values from a pdf with scipy 【发布时间】:2022-01-19 10:20:59 【问题描述】:

给定数据框:

Brick_cp = pd.DataFrame("CP":Brick_cp)

对应于这个分布:

sns.distplot(Brick_cp, fit = stats.norm)

VISUALIZATION

然后我根据这些值创建一个普通函数:

loc, scale = stats.norm.fit(Brick_cp.astype(float))

loc, scale = Out[]: (911.1121589743589, 63.42365993765692)

#PROBABILITY DENSITY FUNCTION (PDF)
x = np.linspace (start = 600, stop = 1200, num = 100)
pdf = stats.norm.pdf(x, loc=loc, scale=scale)

PDF

CDF 对应的对象:

cdf = stats.norm.cdf(x, loc=loc, scale=scale)

CDF

最后我创建了概率密度函数 (PDF):

cdf_ = np.linspace(start=0, stop=1, num=10000)
x_ = stats.norm.ppf(cdf_, loc=loc, scale=scale)

PPF

目的是从 PDF 中生成预定义数量的随机值。为此,我想在 PPF 中生成介于 0 和 1 之间的随机值,并在横坐标上找到相应的值。目前我是这样做的:

v = np.random.uniform(0,1,1000)
f = lambda x1: np.interp(x1, cdf_, x_)
brick_cp_value = f(v)

我想问一下 scipy 中是否有更简单的随机抽样方法,以及我使用的方法是否正确。不幸的是我是初学者。谢谢

编辑:我也试过这个方法:

random_samples = stats.norm.rvs(loc, scale, size=1000)

【问题讨论】:

高斯分布只是为了演示,还是您实际上只想从高斯中采样? 感谢您的回复。我想从高斯采样。我还添加了一个新方法。我希望它是正确的。 【参考方案1】:

从高斯采样是很常见的事情,因此有一个简单的方法可以做到这一点给定 pdf 的平均值 (loc) 和标准变化 (scale)(例如使用 numpy.random.normal()):

import pandas as pd
import numpy as np
import seaborn as sns
import scipy.stats as stats

Brick_cp = pd.DataFrame("CP":Brick_cp)
sns.distplot(Brick_cp, fit = stats.norm)
loc, scale = stats.norm.fit(Brick_cp.astype(float))
random_samples = np.random.normal(loc, scale, size=1000)

【讨论】:

它有效。非常感谢

以上是关于使用 scipy 从 pdf 中选择随机值的主要内容,如果未能解决你的问题,请参考以下文章

为啥从我的自定义分布中抽取的随机样本不遵循 pdf?

你如何从给定的 scipy 随机分布中提取随机数?

python中scipy学习——随机稀疏矩阵及操作

如何使用布尔值从预选列表中选择一个随机值来启用或禁用可用值?

如何使用 pyspark 从 python 列表中选择随机文本值?

使用javascript从关联数组中选择随机值? [复制]