2010-12-14 2 views
14

중간에 softmax 활성화 함수를 사용하는 프로그램을 코딩하려고했습니다.각 변수의 주어진 확률 변수 목록을 선택하십시오.

P[0.10,0.25,0.60,0.05] 

P에있는 모든 변수의 합은 항상 1

이다 나는 목록의 인덱스를 선택하는 방법을 원 : 지금

,이 같은 확률의 목록을 가지고 확률이 주어진다. 즉 또는,

0 - 10% of the time 
1 - 25% of the time 
2 - 60% of the time 
3 - 5% of the time 

을 반환하는 함수 내가있는 곳에서 시작하는 절대적으로 아무 생각도 없어. 어떤 도움을 주시면 감사하겠습니다. 흠 흥미 :)

답변

10

, 방법에 대한 ... 전화 번호에서 각 항목의 가능성을 substracting 목록을 걸어

  • 0과 1

    1. 숫자를 생성합니다.

    2. 빼기 후에 숫자를 0 이하로 가져 오는 항목을 선택하십시오. 간단

    는 O (N)와 작동합니다 :)

  • 2
    import random 
    
    probs = [0.1, 0.25, 0.6, 0.05] 
    r = random.random() 
    index = 0 
    while(r >= 0 and index < len(probs)): 
        r -= probs[index] 
        index += 1 
    print index - 1 
    
    +0

    하하 여기 난 당신이 내가 원래 – slezica

    +0

    @Santiago되는 것을 게시 이초 전에 ~ 생각 : 당신이 영어 : – sje397

    10

    기본적으로 cumulative probability distribution (CDF) 배열을 만듭니다. 기본적으로 주어진 인덱스에 대한 CDF의 값은 P에있는 모든 값의 합계와 같거나 그 인덱스보다 작습니다. 그런 다음 0에서 1 사이의 임의의 숫자를 생성하고 원하는 경우 이진 검색 (또는 선형 검색)을 수행합니다. 여기에 간단한 코드가 있습니다.

    from bisect import bisect 
    from random import random 
    
    P = [0.10,0.25,0.60,0.05] 
    
    cdf = [P[0]] 
    for i in xrange(1, len(P)): 
        cdf.append(cdf[-1] + P[i]) 
    
    random_ind = bisect(cdf,random()) 
    

    물론 당신은 (결과가되며, 변화해야한다)

    [2, 2, 3, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2] 
    

    산출

    rs = [bisect(cdf, random()) for i in xrange(20)] 
    

    같은 랜덤 지수의 무리를 생성 할 수 있습니다. 물론 바이너리 검색은 인덱스가 너무 적기 때문에 불필요하지만 더 많은 인덱스가있는 배포에는 권장됩니다.

    +0

    좋다에 입력 한 이유가 궁금 .... – sje397

    3

    이 문제는 categorical distribution에서 샘플링하는 것과 같습니다. 이 분포는 일반적으로 범주 형 분포에서 여러 샘플의 결과를 모델링하는 다항 분포와 결합됩니다.

    numpy에서는 numpy.random.multinomial을 사용하여 다항식 분포에서 쉽게 샘플링 할 수 있지만 특정 카테고리 버전은 존재하지 않습니다. 그러나 단일 시도로 다항 분포에서 샘플링 한 다음 출력에서 ​​0이 아닌 요소를 반환하여 수행 할 수 있습니다.

    import numpy as np 
    pvals = [0.10,0.25,0.60,0.05] 
    ind = np.where(np.random.multinomial(1,pvals))[0][0] 
    
    15

    쉽게 numpy를 사용하여이를 수행 할 수 있습니다. 이 매개 변수에는 확률 매개 변수를 허용하는 choice 함수가 있습니다.

    np.random.choice(
        ['pooh', 'rabbit', 'piglet', 'Christopher'], 
        5, 
        p=[0.5, 0.1, 0.1, 0.3] 
    ) 
    
    관련 문제