点的聚类采样

时间:2018-07-06 22:31:50

标签: python

考虑范围[0,100]。假设我要从该范围内采样N个点,但是我想将我的采样点“聚类”在50个(或该范围内的任何数字)附近,并且采样点越接近0或100,就成倍地减少。

如何在Python中完成此操作?

谢谢

3 个答案:

答案 0 :(得分:0)

您可以从以50为中心的正态分布中进行采样。这是在NumPy中完成任务的一种方式:

import numpy as np
N = 100
stddev = 10 # Play with it
your_range = 0,100
midpoint = sum(your_range) / 2
samples = np.random.normal(midpoint, stddev, N)
good_samples = samples[(samples <= your_range[1]) &\
                       (samples >= your_range[0])]

答案 1 :(得分:0)

正如DyZ所说,可以使用正态分布,但是正态分布的支持范围是-inf到inf。您还可以使用beta分布,其支持范围是0到1,然后乘以100可以得到0到100。通过看几个示例来选择形状参数:https://en.wikipedia.org/wiki/Beta_distribution

类似:

import numpy as np
a = 20
b = 20
num_samples = 10
samples = np.round(np.random.beta(a, b, num_samples) * 100)

要感受所需的形状,可以尝试以下网站:https://keisan.casio.com/exec/system/1180573226。使用Beta时,您的分布以/(a + b)为中心。在您的情况下,如果希望它居中(50),请确保a = b。然后,您使用的数字越高,分布就会越“尖峰”。

答案 2 :(得分:0)

如果您的意思是平均减少几分,那么一个廉价的解决方案可以像这样工作:

根据指数分布采样值, 将中心移到50并 随机更改传播方向:

import numpy as np

n = 1000
offset = 50
spread = np.random.exponential(scale=np.log(offset), size=n)
direction = (-1)**np.random.randint(2, size=n)

x = offset + spread * direction
# Trim the outliers
x = x[(x <= 100) & (x >= 0)]