核密度估计的随机数生成

2024-09-28 01:27:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

To draw a number x between 0 and 1 and return cdf^{-1}(x), where cdf^{-1} is the inverse cumulative distribution function of 'f'.

问题是,使用statsmodel,我可以找到逆的累积分布,但以矩阵的形式。所以把一个数x乘以矩阵,并不是从计算的KDE分布中得到一个随机样本。在

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

编辑: 下面是一个代码示例:

def calcKDE(data):
    #Calculating KDE
    kde = sm.nonparametric.KDEUnivariate(data)
    kde.fit(kernel='gau', bw='silverman')
    return kde
def generateData(data, kde):
    inverse_cdf = kde.icdf // this is a method which takes no parameters, and so is kde.cdf
    randomSet = np.random.random(1) * inverse_cdf // inverse_cdf is taken as a matrix, will also add a loop here to return 1000 random values
    return randomSet

Tags: and数据datareturnisdef矩阵random
1条回答
网友
1楼 · 发布于 2024-09-28 01:27:28

反变换采样方法如下所示:

from scipy.optimize import brentq
import statsmodels.api as sm
import numpy as np

# fit
kde = sm.nonparametric.KDEMultivariate()  # ... you already did this

# sample
u = np.random.random()

# 1-d root-finding
def func(x):
    return kde.cdf([x]) - u
sample_x = brentq(func, -99999999, 99999999)  # read brentq-docs about these constants
                                              # constants need to be sign-changing for the function

我建议使用定制的示例函数来实现这个类,以便更好地使用。在

这种方法也是非常通用的,并且有很多更快的方法使用关于正在使用的内核的附加信息(没有反变换采样)。你应该在谷歌上找到一些例子。在

另一句话:

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

  • statsmodels(良好的特性,如因变量;基于优化的CV)
  • scikit learn(易于使用;示例函数;基于网格和随机搜索的CV)
  • scipy(不太喜欢它,但是一些用法中基于fft的方法->;fast)

相关问题 更多 >

    热门问题