반응형
import sys
from functools import lru_cache
import math
import numpy as np
import matplotlib.pyplot as plt
@lru_cache(None)
def ncr(n, r):
"""조합. 재귀식을 이용함.
n이 커지면 스택오버플로우 발생.
"""
if r in (0, n):
return 1
return ncr(n - 1, r) + ncr(n - 1, r - 1)
def bidist(n, p):
"""이항분포"""
q = 1 - p
dist = np.array([ncr(n, k) * (p ** k) * (q ** (n - k)) for k in range(n + 1)])
return dist
def bicoeff(n):
"""이항계수. 파스칼의 삼각형."""
l = [1]
for _ in range(n):
l = [a + b for a, b in zip(l + [0], [0] + l)]
return l
def bidist2(n, p):
"""이항분포"""
q = 1 - p
coeff = bicoeff(n)
dist = np.array([coeff[k] * (p ** k) * (q ** (n - k)) for k in range(n + 1)])
return dist
def show_plot(n=120, p=0.38):
plt.grid(True)
plt.plot(bidist2(n, p))
m, s = n * p, math.sqrt(n * p * (1 - p))
plt.axvline(x=m, color="r", alpha=0.6)
plt.axvline(x=(m - s), color="grey", alpha=0.6)
plt.axvline(x=(m + s), color="grey", alpha=0.6)
plt.title("Binomial Distribution $ B(%d, %lf) $" % (n, p))
plt.show()
if __name__ == "__main__":
if len(sys.argv) == 3:
## 실행인자를 주어서, n, p 값을 바꾸어가며 분포를 볼 수 있다.
n, p = int(sys.argv[1]), float(sys.argv[2])
if n > 1 and 0 < p < 1:
show_plot(n, p)
sys.exit()
## 실행인자가 없거나 조건에 맞지 않으면,
## n=120, p=0.38 기본값의 분포를 보여줌.
show_plot()
n=120, p=0.38 일 때의 분포
n=7, p=0.38 일 때의 분포
728x90
'프로그래밍 > Python' 카테고리의 다른 글
[Konlpy|Mecab] Ubuntu 에서 Mecab-ko를 설치했으나, Mecab이 설치되었는지를 다시 묻는다. (1) | 2018.12.06 |
---|---|
[Python|Numpy|Matplotlib] 푸리에 시리즈 사각파 (0) | 2018.12.06 |
[Python] pandas read_csv issue regarding non-ascii filename (0) | 2018.11.08 |
[Python] 실수값 연분수로 근사값 분수 찾기, approx real value using continued fraction (0) | 2018.06.20 |
[Anaconda] 아나콘다 파이썬의 로컬 업데이트 서버를 어떻게 만들 수 있나? (0) | 2018.06.08 |