2024-04-25 23:11:11 发布
网友
我使用scipy.stats中的gaussian_kde来拟合多变量数据中的联合PDF,比如X和Y
现在我想从这个PDF中有条件地对X值进行重采样。例如,当我的X=X时,从它的条件分布中生成Y
让我们使用文档here中的示例kernel.resample(1)将在所有分布上生成一对(X,Y)。例如,当X为0时,如何生成Y
kernel.resample(1)
一种方法是从pdf创建custom continuous distribution。 可以通过kernel函数创建pdf。由于pdf需要一个1的区域,限制在给定x0内的内核应该按该区域缩放
kernel
x0
不过,自定义分发似乎相当缓慢。一个更快的解决方案是从ys = np.linspace(-10, 10, 1000); kernel(np.vstack([np.full_like(ys, x0), ys]))创建一个直方图并使用^{}。更快(但随机性要小得多)的方法是使用np.random.choice(..., p=...)和从受约束内核计算的p
ys = np.linspace(-10, 10, 1000); kernel(np.vstack([np.full_like(ys, x0), ys]))
np.random.choice(..., p=...)
以下代码从采用2D kde的链接示例代码开始
import matplotlib.pyplot as plt from scipy import stats import numpy as np def measure(n): m1 = np.random.normal(size=n) m2 = np.random.normal(scale=0.5, size=n) return m1 + m2, m1 - m2 ** 2 m1, m2 = measure(2000) xmin = m1.min() xmax = m1.max() ymin = m2.min() ymax = m2.max() X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] positions = np.vstack([X.ravel(), Y.ravel()]) values = np.vstack([m1, m2]) kernel = stats.gaussian_kde(values) Z = np.reshape(kernel(positions).T, X.shape) x0 = 0.678 fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 4)) ax1.imshow(np.rot90(Z), cmap=plt.cm.magma_r, alpha=0.4, extent=[xmin, xmax, ymin, ymax]) ax1.plot(m1, m2, 'k.', markersize=2) ax1.axvline(x0, color='dodgerblue', ls=':') ax1.set_xlim([xmin, xmax]) ax1.set_ylim([ymin, ymax]) # create a distribution given the kernel function limited to x=x0 class Special_distrib(stats.rv_continuous): def _pdf(self, y, x0, area_x0): return kernel(np.vstack([np.full_like(y, x0), y])) / area_x0 ys = np.linspace(-10, 10, 1000) area_x0 = np.trapz(kernel(np.vstack([np.full_like(ys, x0), ys])), ys) special_distr = Special_distrib(name="special") vals = special_distr.rvs(x0, area_x0, size=500) ax2.hist(vals, bins=20, color='dodgerblue') plt.show()
一种方法是从pdf创建custom continuous distribution。 可以通过
kernel
函数创建pdf。由于pdf需要一个1的区域,限制在给定x0
内的内核应该按该区域缩放不过,自定义分发似乎相当缓慢。一个更快的解决方案是从} 。更快(但随机性要小得多)的方法是使用
ys = np.linspace(-10, 10, 1000); kernel(np.vstack([np.full_like(ys, x0), ys]))
创建一个直方图并使用^{np.random.choice(..., p=...)
和从受约束内核计算的p以下代码从采用2D kde的链接示例代码开始
相关问题 更多 >
编程相关推荐