• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wektoryzacja rozkładu multinomial w pythonie

+1 głos
249 wizyt
pytanie zadane 15 lutego 2023 w Python przez zibiken Początkujący (310 p.)

Cześć, zastanawiam się, czy istnieje jakiś sposób na wektoryzację funkcji np.random.multinomial albo torch.multinomial w taki sposób by nie przyjmowały liczby prób i wektora prawdopodobieństw, tylko wektor ilości prób i macierz prawdopodobieństw, co sprawi, że każde generowanie będzie posiadać inne parametry (w przeciwieństwie do parametru size, który tylko powiela ten sam eksperyment). 

Kod pokazujący dokładnie o co chodzi:

import numpy as np

# dummy data for testing
tries = np.random.randint(1000, 10000, size=1000)
probs = np.random.rand(1000, 3)
probs /= probs.sum(axis=1, keepdims=True)

# output array
output = np.zeros((1000, 3), dtype=int)

# TODO vectorize this loop 
for i in range(len(tries)):
    output[i, :] = np.random.multinomial(tries[i], probs[i])

Na internecie znalazłem jedynie coś takiego https://stackoverflow.com/questions/36952419/vectorizing-numpy-random-multinomial. Niestety tutaj problem jest zredukowany do jednej próby czyli defacto losowego wyboru z różnymi prawdopodobieństwami dla elementów.

Zastanawiam się czy istnieje jakiś mądry sposób, który niekoniecznie korzysta z funkcji np.random.multinomial, ale pozwala na znaczące przyśpieszenie takiego eksperymentu poprzez pozbycie się pętli.

1 odpowiedź

+2 głosów
odpowiedź 15 lutego 2023 przez zibiken Początkujący (310 p.)

Znalazłem odpowiedź na to pytanie. Zdecydowałem się odpowiedzieć zamiast usuwać, jeśli komuś się przyda (jakkolwiek nie byłoby to mało prawdopodobne).

tries = np.random.randint(1000, 10000, size=1000)
probs = np.random.rand(1000, 3)
probs /= probs.sum(axis=1, keepdims=True)

# vectorized version
rng = np.random.default_rng()
output = rng.multinomial(tries, probs)

Z pomiarów %timeit wynika, że to rozwiązanie jest ponad 10 razy szybsze.

Podobne pytania

0 głosów
3 odpowiedzi 984 wizyt
pytanie zadane 10 września 2021 w Python przez thesolitaryofchoice Początkujący (490 p.)
0 głosów
0 odpowiedzi 356 wizyt
pytanie zadane 10 marca 2021 w Python przez cba Użytkownik (620 p.)
0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 21 października 2020 w Python przez poldeeek Mądrala (5,980 p.)

93,691 zapytań

142,610 odpowiedzi

323,215 komentarzy

63,215 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...