Untitled

 avatar
unknown
python
9 months ago
1.0 kB
1
Indexable
# Alias sampling

def alias_sample(probs):
    n = len(probs)
    F = probs * n

    alias_list = np.zeros(n) 
    prob_list = np.zeros(n)

    G = list(np.where(F>=1)[0])
    S = list(np.where(F<1)[0])

    while G and S:
        j = S.pop()
        i = G.pop()
        
        prob_list[j] = F[j]
        alias_list[j] = i
        F[i] = F[i] - (1.0 - F[j])

        if F[i] < 1:
            S.append(i)
        else:
            G.append(i)
    
    # rest should be assigned 1
    for i in G + S:
        prob_list[i] = 1.0

    return prob_list, alias_list

probs = np.array([7/48,5/48,1/8,1/16,1/4,5/16])

prob_list,alias_list = alias_sample(probs)


def alias_sample(prob, alias, n):
    K = len(prob)
    samples = np.zeros(n)
    for i in range(n):
        k = np.random.randint(K)
        if np.random.random(1) < prob[k]:
            samples[i] = k
        else:
            samples[i] = alias[k]
    return samples



plt.hist(alias_sample(prob_list,alias_list,10000)+1)
Editor is loading...
Leave a Comment