Как создать массив случайных чисел, который содержит 3-сигма-выбросы? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь протестировать некоторые функции классификации, и для этого мне нужно сгенерировать неоднородные случайные числа, чтобы были выбросы (среднее значение + - 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 выбросов, но результаты дают пустой массив.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Ваш фильтр правильный: проблема в том, что стандартное отклонение au неравномерное распределение равно (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
0 голосов
/ 06 февраля 2019

Как насчет старого доброго нормального распределения ?Выборка из нормального распределения может быть сделана с numpy.random.standard_normal или numpy.random.normal:

import numpy as np

s = np.random.standard_normal(size=10000)

outliers = s[(abs(s - s.mean())) > (3 * s.std())]
print(outliers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...