[코드IQ] 주사위의 확률 분포를 써 보았다(코드IQ 기계학습에서 발췌한 수학 강좌[확률 분포 편])

2586 단어 codeiqPython

개시하다


이 항목은 코드IQ지택릉은 프로그래밍과 함께 공부합시다!기계 학습을 위한 수학 강좌[확률 분포편] 후반부로, 주사위 확률이 분포된 글의 코드를 이해하지 못하기 때문에 자신이 이해할 수 있는 범위 내에서 코드를 만들 때의 메모다.
psyhon은 초보자이기 때문에 글씨를 쓰는 방법이 좀 이상할 수 있습니다.

컨디션


Python 2.7.10

공식 이해 주사위 확률 분포


공식.



* 사진 참조 기사

과제.


Q. 주사위를 5번 굴려 눈알이 나올 확률의 분포를 계산해보자.확률 분포는 확률을 열거한 것이다.
주사위의 확률 분포 공식은 상술한 공식이다.
공식적인 해설, 확률 분포는 기사에 상세한 기술이 있기 때문에 여기에 코드 제작에 필요한 정보를 써야 한다.
N

시행 횟수인 만큼 과제는'주사위 5번 던지기', N=5
N!

5층 건물.math 라이브러리의factorial 사용 방법
k1 k2 k3 k4 k5 k6

주사위를 N번 던질 때 주사위가 나오는 횟수의 조합
예컨대 5번 던진 경우
5번이 모두 1인 경우,k1=5k2=0k3=0k4=0k5=0k6=0
5번 중 6번 이상일 경우 k1 = 1k2 = 1k3 = 1k4 = 1k5 = 1k6 = 0
.
확률 분포에서 각 조합의 확률을 계산한다(이해).

확률 분포를 찾다


먼저 주사위를 5번 던질 때의 출발점 조합을 조사한다.
k1 = 5k2 = 0k3 = 0k4 = 0k5 = 0k6 = 0시
k1 = 4k2 = 1k3 = 0k4 = 0k5 = 0k6 = 0시
k1 = 4k2 = 0k3 = 1k4 = 0k5 = 0k6 = 0시
이 문제를 고려하면 코드를 쓰는 것이 매우 번거롭기 때문에 먼저 kX를 모두 0~5로 입력한 상태에서 k1~k6의 조합을 모두 꺼내라
이런 느낌.
#k1-k2-k3-k4-k5-k6
0-0-0-0-0-5
0-0-0-0-1-4
0-0-0-0-2-3
...
5-5-5-5-5-3
5-5-5-5-5-4
5-5-5-5-5-5
모든 조합은 다음 코드의 귀속 함수 (create pattern (k,list) 를 사용하여 만듭니다.
그리고 조합 중 k1~k6만 합계가 5인 조합으로 공식에 따라 확률을 계산한다.
python
#!/usr/bin/env python
import math 

#再帰関数で全組み合わせを作る
#ハイフン区切りの組み合わせにする
def create_pattern(k, list):
  if k ==  1:
     for i in xrange(0, 6):
      list.append(str(i))
  else:
    new_list = []
    for pattern in list:
      for j in xrange(0, 6):
        new_list.append(pattern + '-' + str(j))

    list = new_list

  if k == 6:
    return list
  else:
    k = k + 1
    return create_pattern(k, list)


# サイコロを投げる回数
n = 5

all_pattern_str_list = create_pattern(1, [])

#ハイフン区切りの組み合わせを分解して、合計が5の組み合わせのみ、確率を計算していく
for all_pattern_str in all_pattern_str_list:
  tmp_list = all_pattern_str.split('-')

  pattern_sum = 0
  pattern_list = []
  for tmp_str in tmp_list:
    pattern_list.append(int(tmp_str))

  if sum(pattern_list) == 5:
    print pattern_list

    #公式の分母(k1!k2!k3!k4!k5!k6!)を計算
    denom = 1
    for p in pattern_list:
      denom = denom * math.factorial(p)

    #確率の計算
    print (math.factorial(n) / denom) * (1.0 / 6.0 ** n)

총결산


문장에도 있지만 코드에 빠지면 수학도 쉽게 이해된다.

좋은 웹페이지 즐겨찾기