이항 분포의 확률 질량 함수를 파이썬으로 작성해보십시오.
이번에는 전체 시도 횟수 n회 성공 확률 p의 이항 분포에 대해 다음과 같은 기능을 가진 클래스를 작성합니다.
표현식의 내용을 기억하는 것이 목적이므로 성능은 고려하지 않습니다.
이번 파이썬으로 재현하는 공식
성공 확률이 p의 베르누이 시행(이항 시행)을 전부 n회 실시했을 때의,
성공 횟수가 x가 될 확률 질량을 구하는 함수
f(x,n,p) = {}_n \mathrm{ C }_xp^x(1-p)^{ n-x } \quad (0 \leqq n;\ 0 \leqq x \leqq n;\ 0 \leqq p\leqq 1)\\
성공 횟수 x의 하측 누적 확률을 구하는 함수
P(n,x,p) = \sum_{i=0}^xf(i,n,p)
성공 횟수 x의 위쪽 누적 확률을 찾는 함수
P(n,x,p) = \sum_{i=x}^nf(i,n,p)
파이썬으로 작성해 보았습니다.
import math
import numpy as np
import matplotlib.pyplot as plt
class ToolBox:
def combination(total, chosen):
return math.factorial(total) / math.factorial(chosen)/ math.factorial(total-chosen)
class BinomialDistribution:
"""
全試行回数nと成功確率pの二項分布オブジェクトを生成する.
Attributes
----------
total : int
全試行回数n.
p_of_sccess : float
一回の試行における成功確率p.
p_of_fail : float
一回の試行における失敗確率1-p.
"""
def __init__(self, total, p_of_success):
"""
Parameters
----------
total : int
全試行回数n.
p_of_success : float
一回の試行における成功確率p.
"""
assert total > 0, "Condition error: 0 <= total"
assert p_of_success >= 0 and p_of_success <= 1, "Condition error: 0 <= p_of_success <= 1"
self.total = total
self.p_of_sccess = p_of_success
self.p_of_fail = 1 - p_of_success
def get_probability_mass(self, success):
"""
x回成功する確率質量を求める
Parameters
----------
success : int
成功回数x.
Returns
-------
probability_mass : float
xの確率質量.
"""
assert success >= 0 and success <= self.total, "Condition error: 0 <= sccuess <= total"
fail = self.total - success
combination = ToolBox.combination(self.total, success)
probability_mass = combination * (self.p_of_sccess ** success) * (self.p_of_fail) ** fail
return probability_mass
def get_lower_culmitive_distribution(self, success):
"""
xの下側累積確率(0〜x回の確率質量の和)を求める.
Parameters
----------
success : int
成功回数x.
Returns
-------
result : float
xの下側累積確率.
"""
result = 0
for i in range (0, success + 1):
result += binomial_distribution.get_probability_mass(i)
return result
def get_upper_culmitive_distribution(self, success):
"""
xの上側累積確率(x〜全試行回数の確率質量の和、)を求める.
Parameters
----------
success : int
成功回数x.
Returns
-------
result : float
xの上側累積確率.
"""
result = 0
for i in range (success, self.total + 1):
result += binomial_distribution.get_probability_mass(i)
return result
def draw_graph(self):
"""
グラフを描画してpng形式で保存する.
"""
x = np.arange(0, self.total + 1, 1)
y = []
for i in range(0, self.total + 1):
y.append(self.get_probability_mass(i))
plt.plot(x, y)
plt.savefig('graph.png')
실행
# 全試行回数10回、成功確率0.5の二項分布オブジェクトを作成する.
binomial_distribution = BinomialDistribution(10, 0.5)
# 成功回数2回の場合の確率質量を取得する.
print(binomial_distribution.get_probability_mass(2))
# 成功確率2回の場合の下側累積確率を取得する.
print(binomial_distribution.get_lower_culmitive_distribution(2))
# 成功確率2回の場合の上側累積確率を取得する.
print(binomial_distribution.get_upper_culmitive_distribution(2))
# この二項分布のグラフを描画する.
binomial_distribution.draw_graph()
결과
0.0439453125 # 成功回数2回の場合の確率質量
0.0546875 # 成功確率2回の場合の下側累積確率
0.9892578125 # 成功確率2回の場合の上側累積確率
답변은 여기 사이트를 사용했습니다.
htps : // 케이씨. 카시오. jp/에 c/sys m/1161228843
그래프는 동일한 디렉토리에 저장됩니다.
2020년 4월 7일 수정 내용
success
)가 이산적인 값인 경우 후자를 사용하는 것 같다. 그러나 이산 이항 분포에 대해 "확률 밀도"를 사용하는 사이트와 책도 있으므로 엄격하게 구별되지 않는 것 같습니다.successs
)를 생성자에서 분리하고 메서드 호출시 지정하도록 수정 참고로 한 사이트
MathJax를 작성하는 방법
h tps : // 에아 sy - py - 마 th 그럼 x. 나카켄 88. 코m/
이항 분포를 계산하는 사이트
htps : // 케이씨. 카시오. jp/에 c/sys m/1161228843
확률 밀도 함수와 확률 질량 함수
h tps://다타-s 시엔세. gr. jp / teo ry / tbs_pdf_an d_pmf. HTML
Reference
이 문제에 관하여(이항 분포의 확률 질량 함수를 파이썬으로 작성해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/863/items/47d6e4bec12573aba007
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(이항 분포의 확률 질량 함수를 파이썬으로 작성해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/863/items/47d6e4bec12573aba007텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)