본문 바로가기

개념 정리/implement_python

python_probablity_bayesian

2022.11.04 - [개념 정리] - 확률론

5, 5 크기의 정수 데이터 생성
import numpy as np

np.random.seed(0)
data = np.random.randint(10, size = (5,5))
data
>>>
array([[5, 0, 3, 3, 7],
       [9, 3, 5, 2, 4],
       [7, 6, 8, 8, 1],
       [6, 7, 7, 8, 1],
       [5, 9, 8, 9, 4]])

각 행의 행렬 요소는 각각의 확률 분포에 대한 등장 횟수,

N = np.sum(data)
N
>>>
135

표본의 추출 횟수 N은 모든 행들의 합

for i in range(data.shape[0]):
  for j in range(data.shape[1]):
    data[i, j]
각각의 취할 수 있는 값들에 대해서 X = xi, Y = yj 인 시도의 횟수는 data 행렬의 data[i,j] 요소
sum_x = 0
sum_y = 0

x_i = []
y_i = []

for i in range(data.shape[0]):
  sum_x = 0
  sum_y = 0
  for j in range(data.shape[1]):
    sum_x += data[i][j]
    sum_y += data[j][i]
  x_i.append(sum_x)
  y_i.append(sum_y)
  
x_i
>>>
[18, 23, 30, 29, 35]

y_i
>>>
[32, 25, 31, 30, 17]
각각의 취할 수 있는 값들에 대해서 X = xi, Y = yj 인 시도의 횟수는 data 행렬의 data[i,j] 요소
X = xi 인 시도를 x_i, Y = yj 인 시도의 숫자를 y_i로 표현한다.
def joint_probability(data, i, j):
  """
  X=xi, Y=yj 일 결합 확률
  Args:
    data : 행렬 형태의 전체 데이터
    i : 행의 개수
    j : 열의 개수
  Return
    X=xi, Y=yj 일 결합 확률값
  """
  N = np.sum(data)
  return data[i,j]/N
joint_probability(data, 1,1)
>>>
0.022222222222222223
 
X가 xi, Y가 yj 일 확률을 p(X=xi, Y=yj) 로 적고 이를 X=xi, Y=yj 일 결합 확률이라 한다.

이는 i, j 칸에 있는 포인트의 숫자를 전체 포인트들의 숫자로 나눠서 구할 수 있다.
def joint_probability_row(data, n):
  """
  n 행의 값을 가질 확률
  Args:
    data : 행렬 형태의 전체 데이터
    n : 행 번호
  Return
    n 행의 값을 가질 확률
  """
  sum = 0
  N = np.sum(data)

  for i in range(data.shape[0]):
    sum += data[n,i]
  return sum/N
joint_probability_row(data, 1)
>>>
0.17037037037037037
X가 xi 값을 가질 확률도 구할 수 있다. 해당 행에 있는 포인트들의 숫자를 전체 포인트들의 숫자로 나눠서 구한다.
sum = 0
for i in range(data.shape[1]):
  sum += joint_probability(data, 1, i)

sum
>>>
0.1703703703703704
i행에 있는 사례의 숫자는 해당 행의 각 칸에 있는 사례의 숫자 합이다. 이것이 확률의 합의 법칙이다.

결과가 동일한 것을 확인할 수 있다.

조건부 확률

조건부 확률 X = xi 인 사례들 중 Y = yj 인 사례들의 비율을 생각해 볼 수 있다. 

이를 조건부 확률이라고 한다.
def conditional_probability(data, i, j):
  """
  조건부 확률의 계산
  Args:
    data : 
    i : 행 
    j : 열
  Return :
    조건부 확률의 계산값
  """
  return joint_probability(data, i, j) / joint_probability_row(data, i)
conditional_probability(data, 1, 2)
>>>
0.21739130434782608

 

 

 

이 확률은 i행에 있는 전체 포인트 수와 (i, j) 칸에 있는 포인트 수의 비율을 통해서 계산할 수 있다.

이를 통해 곱의 법칙을 도출해 낼 수 있다.

joint_probability(data, 1, 2)
>>>
0.037037037037037035

conditional_probability(data, 2, 1) * joint_probability_row(data, 1)
>>>
0.03584229390681004

python 의 실수 표현 한계 때문에 오차의 발생

conditional_probability(data, 1, 2)
>>>
0.21739130434782608

conditional_probability(data, 2, 1)*joint_probability_col(data, 1)/joint_probability_row(data, 2)
>>>
0.16666666666666666

 

'개념 정리 > implement_python' 카테고리의 다른 글

python_matrix  (0) 2022.11.18
CNN_python_implement  (0) 2022.11.03
backpropagation python 구현  (0) 2022.10.30