我有一个一维数据集,我已经使用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
答案 0 :(得分:4)
逆变换采样方法如下所示:
jq -r '.notifiestext | map(select(.read==false))' temp_notif |
jq --arg foo "$max" 'map(select(.id<$foo))'
我建议实现这个基于类的,使用自定义的示例函数以便更好地使用。
这种方法也很通用,使用有关正在使用的内核的附加信息(没有逆变换采样)有更快的方法。你应该通过谷歌搜索找到一些例子。
另一句话:
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工具(我的意见):