我正在尝试测试一些分类函数,因此我需要生成非均匀的随机数,以便出现异常值(平均值+-3 * SD)。到目前为止,我所看到的只是numpy的随机分布。
import numpy as np
np.random.rand(100)
s = np.random.randint(0,100, size=(10000,1))
结果 [10,20,30,...]
s[(abs(s - s.mean())) > (3*s.std())]
在这里,我希望能看到30个离群值,但是结果会产生一个空数组。
答案 0 :(得分:0)
好的老normal distribution怎么样?可以使用numpy.random.standard_normal
或numpy.random.normal
从正态分布中进行采样:
src/main/resources/applicationContext.xml
答案 1 :(得分:0)
您的过滤器是正确的:问题是u niform distribution的标准偏差为(b-a)/sqrt(12)
(范围很广的随机整数样本与均匀分布非常相似)。因此,平均值+-3倍标准偏差始终位于样本范围之外。
您需要无限制的分布和/或形状更居中的东西。这个例子可以工作(大小可能有所不同,取决于您的分布):
# power of 0-1 random
s = np.random.random(10000)**5
s[np.abs(s - s.mean()) > s.std() * 3].size
>> 164
# average of 6 uniforms
s=np.sum(np.random.randint(0,1000, size=10000) for i in range(6))/6
s[np.abs(s - s.mean()) > s.std() * 3].size
>> 16
# And of course unbounded distributions such as the normal:
s = np.random.normal(size=10000)
s[np.abs(s - s.mean()) > s.std() * 3].size
>> 27