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

时间:2016-11-09 18:32:34

标签: python math machine-learning scipy statistics

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

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

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

  

在0和1之间绘制一个数字x并返回cdf ^ { - 1}(x),其中   cdf ^ { - 1}是' 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

1 个答案:

答案 0 :(得分:4)

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

jq -r '.notifiestext | map(select(.read==false))' temp_notif |
  jq --arg foo "$max" 'map(select(.id<$foo))'

我建议实现这个基于类的,使用自定义的示例函数以便更好地使用。

这种方法也很通用,使用有关正在使用的内核的附加信息(没有逆变换采样)有更快的方法。你应该通过谷歌搜索找到一些例子。

另一句话:

  • scikit-learn's kernel-density-estimation带来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(很好的功能,如因变量;基于优化的简历)
  • scikit-learn(易于使用;样本函数;基于网格和随机搜索的简历)
  • scipy(不喜欢它,但基于fft的方法用于某些用法 - &gt;快速)