Генерация случайных наборов владений с использованием NumPy - PullRequest
0 голосов
/ 26 сентября 2018

Мне нужно создать несколько (скажем, 100 000) случайных наборов авуаров для пользователей, которые могут держать несколько авуаров.Для любого данного пользователя эти авуары должны быть равны 1. Теоретически, генерация этих случайных авуаров может быть достаточно легко выполнена в виде цифры:

num_users = 100000
num_holdings = 8

random_holdings = np.random.rand(num_users, num_holdings)
random_holdings /= np.sum(random_holdings, axis=1, keepdims=True)

Это дает нам

random_holdings
array([[0.044, 0.169, 0.204, ..., 0.051, 0.116, 0.176],
       [0.132, 0.078, 0.23 , ..., 0.102, 0.028, 0.204],
       [0.036, 0.182, 0.165, ..., 0.138, 0.065, 0.04 ],
       ...,
       [0.195, 0.028, 0.136, ..., 0.147, 0.113, 0.22 ],
       [0.19 , 0.237, 0.061, ..., 0.23 , 0.109, 0.046],
       [0.181, 0.111, 0.1  , ..., 0.166, 0.126, 0.199]])

.проблема заключается в том, что это приводит ко многим подобным наборам авуаров и относительно небольшому количеству наборов сконцентрированных авуаров.Например:

len(np.where(random_holdings > 0.5)[0])

дает результат 24, то есть из всех 100 000, которые больше 0,5, есть только 24 холдинга.

Может кто-нибудь любезно порекомендовать лучший метод рандомизацииили просто более разумный общий подход, чтобы у меня было меньше похожих наборов авуаров и более концентрированных наборов авуаров?

Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

Вы просите «лучший метод рандомизации», но «лучше» не является четко определенным.Если вы просто хотите что-то , которое даст более экстремальные вариации в запасах, вы можете попробовать

random_holdings = np.random.pareto(1, size=(num_users, num_holdings))

и затем нормализовать, как вы уже сделали.

Первый аргументpareto контролирует форму распределения.Используйте большие значения для менее экстремальных изменений в запасах.Вы также можете поэкспериментировать с другими дистрибутивами с тяжелыми хвостами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...