生成随机数以测试核密度估计

我有一个一维数据集,我已经使用statsmodels和scipy在Python中计算了核密度估计。

我想生成一组随机数,看看它们是否能给我相同的分布。

到目前为止,我找到的解决方案是这样的:

在0到1之间抽取一个数x,并返回cdf^{-1}(x),其中cdf^{-1}是’f’的逆累积分布函数。

这个方法的问题是,使用statsmodels我能够找到逆累积分布,但它是以矩阵的形式存在的。因此,将一个数x乘以这个矩阵并不能给我从计算的KDE分布中得到的随机样本。

我如何从给定的KDE函数或分布中生成随机数呢?

编辑:这里有一个代码示例:

def calcKDE(data):    #计算KDE    kde = sm.nonparametric.KDEUnivariate(data)    kde.fit(kernel='gau', bw='silverman')    return kdedef generateData(data, kde):    inverse_cdf = kde.icdf #这是一个不带参数的方法,kde.cdf也是如此    randomSet = np.random.random(1) * inverse_cdf #inverse_cdf被视为矩阵,这里还将添加一个循环以返回1000个随机值    return randomSet

回答:

逆变换抽样方法如下所示:

from scipy.optimize import brentqimport statsmodels.api as smimport numpy as np# 拟合kde = sm.nonparametric.KDEMultivariate()  # ... 你已经做了这个# 抽样u = np.random.random()# 1-d 根查找def func(x):    return kde.cdf([x]) - usample_x = brentq(func, -99999999, 99999999)  # 阅读brentq文档关于这些常数的说明                                              # 常数需要使函数改变符号

我建议以基于类的形式实现这个方法,并自定义一个抽样函数以便更好地使用。

这种方法也非常通用,并且有许多更快的方法使用关于所用核的附加信息(不使用逆变换抽样)。你可以通过谷歌找到一些例子。

另一个评论:

我对kde工具从最好到最差的排序(我的观点):

  • statsmodels(像依赖变量这样的好功能;基于优化的交叉验证)
  • scikit-learn(易于使用;sample-function;基于网格和随机搜索的交叉验证)
  • scipy(不太喜欢它,但对于某些用途有基于fft的方法 -> 快)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注