본문 바로가기

ChatGPT/인공지능

[ML] 머신 러닝에서 사용되는 11가지 확률 분포 함수 소개 ( 파이썬 )

반응형

1. 소개

확률 함수는 머신 러닝에서 중요한 개념 중 하나로, 데이터의 확률적 관계를 모델링하는 데 사용됩니다. 확률 함수는 입력값에 대해 어떤 확률을 예측하거나, 데이터의 분포를 모델링하는 데 활용됩니다.

머신 러닝은 데이터로부터 패턴을 학습하는 기법으로, 데이터의 분포와 특성 사이의 관계를 이해하는 것이 중요합니다. 확률 함수는 이러한 관계를 고려하여 데이터에 대한 예측 또는 각 데이터 포인트의 확률을 계산하는 데 사용됩니다.

이 블로그 글에서는 확률 함수의 개념과 특성에 대해 소개하고, 대표적인 확률 함수들을 살펴볼 것입니다. 또한, 확률 함수를 이용한 머신 러닝 예시를 통해 실제 응용 사례도 살펴볼 것입니다.

확률 함수를 잘 이해하고 활용하는 것은 머신 러닝 모델의 성능을 향상시키고, 데이터에 대한 이해를 깊이 있게 할 수 있는 중요한 요소입니다. 그러므로 확률 함수에 대한 이해는 머신 러닝 엔지니어와 데이터 과학자에게 필수적인 지식입니다. 준비된다면, 확률 함수의 개념과 활용에 대해 자세히 알아보도록 하겠습니다.

2. 확률 함수 개념 설명

2.1 확률 함수의 정의와 특성

확률 함수는 입력 변수에 대한 확률 값을 출력하는 함수입니다. 즉, 확률 함수는 주어진 입력에 대해 이벤트가 발생할 확률을 나타내는 함수이며, 이를 통해 데이터의 확률적 관계를 모델링하고 예측할 수 있습니다.

확률 함수는 일반적으로 입력 변수에 대한 확률 밀도 함수 (PDF: Probability Density Function) 또는 확률 질량 함수 (PMF: Probability Mass Function)로 표현됩니다. PDF는 연속적인 변수에 대한 확률을 설명하고, PMF는 이산적인 변수에 대한 확률을 설명합니다.

확률 함수는 특정한 조건을 만족해야 합니다. 첫째, 확률 함수의 값은 항상 0 이상이며, 전체 확률 공간에 대해 적분 또는 합계가 1이 되어야 합니다. 둘째, 변수의 가능한 모든 값에 대해, 확률 함수는 음수가 아니어야 하며, 그 값은 0과 1 사이에 있어야 합니다.

2.2 입력과 출력의 처리 방식

확률 함수는 일반적으로 입력 변수 (주로 X)와 확률 변수 (주로 Y) 사이의 관계를 모델링합니다. 입력 변수는 주어진 데이터의 특성을 나타내는 것으로, 예를 들어 주택의 크기, 고객의 구매 이력 등이 될 수 있습니다. 확률 변수는 그에 대한 확률을 나타내는 것으로, 주택 가격, 고객이 구매할 확률 등이 될 수 있습니다.

확률 함수는 입력 변수와 확률 변수 간의 관계를 나타내기 위해 다양한 모델을 사용합니다. 선형 모델, 로지스틱 모델, 가우시안 모델 등 다양한 모델을 적용하여 데이터의 확률적 관계를 모델링할 수 있습니다. 모델 선택은 주어진 문제와 데이터에 따라 달라질 수 있으며, 모델의 적합성을 평가하기 위해 통계적인 기법이 사용됩니다.

2.3 확률 함수의 종류와 예시

확률 함수는 다양한 형태로 나타날 수 있습니다. 가장 간단한 형태로는 베르누이 분포와 정규 분포가 있습니다. 베르누이 분포는 이진 (0 또는 1) 변수에 대한 확률을 나타내며, 정규 분포는 연속적인 변수에 대한 확률을 나타냅니다.

또한, 로지스틱 함수는 범위가 0과 1 사이인 S자 형태의 함수로, 이진 분류 문제에서 주로 사용됩니다. 다항 분포는 분류 문제에서 주로 사용되며, 여러 개의 카테고리에 대한 확률을 나타냅니다.

이외에도 지수 분포, 감마 분포, 베타 분포 등 다양한 확률 함수가 있으며, 문제에 맞는 적절한 확률 함수를 선택하는 것이 중요합니다. 다음 섹션에서는 대표적인 확률 함수 중 일부를 더 자세히 살펴보도록 하겠습니다.

3. 대표적인 확률 함수들 소개

3.1 베르누이 분포

베르누이 분포는 이진 (0 또는 1) 변수에 대한 확률을 나타낼 때 사용되는 확률 분포입니다. 이 분포는 확률 변수가 각 값에 대해 나타날 확률을 정의하며, 주어진 특정 사건이 발생할 확률과 그 사건이 발생하지 않을 확률의 합은 1이 됩니다.

베르누이 분포의 확률 질량 함수 (PMF)는 다음과 같이 정의됩니다.

def bernoulli_pmf(x, p):
    """
    베르누이 확률 질량 함수를 계산하는 함수

    Parameters:
    - x : 0 또는 1인 이진 변수
    - p : 0과 1 사이의 확률값

    Returns:
    - 베르누이 확률 질량 함수 값
    """
    if x == 1:
        return p
    elif x == 0:
        return 1 - p
    else:
        return 0

위의 코드는 베르누이 분포의 확률 질량 함수를 계산하는 Python 함수입니다. 함수는 입력 변수 x와 확률 p를 받고, x가 1이면 p를 반환하고, x가 0이면 1에서 p를 뺀 값을 반환합니다. 다른 값인 경우에는 0을 반환합니다.

이를 예시로 살펴보면, x가 1인 경우에 p가 0.6일 때의 확률 질량 함수의 결과는 0.6이 됩니다.

>>> bernoulli_pmf(1, 0.6)
0.6

마찬가지로 x가 0인 경우에는 1에서 p를 뺀 값인 0.4가 됩니다.

>>> bernoulli_pmf(0, 0.6)
0.4

이와 같이 베르누이 분포의 확률 질량 함수를 사용하면 이진 변수에 대한 확률을 계산할 수 있습니다.

3.2 정규 분포

정규 분포는 많은 자연 현상에서 나타나는 연속적인 확률 분포로, 종 모양의 대칭적인 분포를 가집니다. 평균 (μ)과 표준 편차 (σ)를 가지며, 확률 변수의 값이 평균 주변에서 어떻게 분포하는지를 나타냅니다.

정규 분포의 확률 밀도 함수 (PDF)는 다음과 같이 정의됩니다.

import numpy as np
import matplotlib.pyplot as plt

def normal_pdf(x, mean, std):
    """
    정규 분포 확률 밀도 함수를 계산하는 함수

    Parameters:
    - x : 확률 변수 값
    - mean : 평균
    - std : 표준 편차

    Returns:
    - 정규 분포 확률 밀도 함수 값
    """
    exponent = -0.5 * ((x - mean) / std) ** 2
    coefficient = 1 / (std * np.sqrt(2 * np.pi))
    return coefficient * np.exp(exponent)

위의 코드는 정규 분포의 확률 밀도 함수를 계산하는 Python 함수입니다. 함수는 입력 변수 x, 평균 mean, 그리고 표준 편차 std를 받습니다. 함수는 입력 변수 x에 해당하는 확률 변수값의 확률 밀도 값을 반환합니다.

이를 예시로 살펴보면, 평균이 0이고 표준 편차가 1인 정규 분포의 확률 밀도 함수를 사용해 x가 2일 때의 밀도 값을 계산할 수 있습니다.

>>> normal_pdf(2, 0, 1)
0.05399096651318806

동일한 정규 분포에서 x가 -1일 때의 밀도 값을 계산할 수도 있습니다.

>>> normal_pdf(-1, 0, 1)
0.24197072451914337

이처럼 정규 분포의 확률 밀도 함수를 사용하면 주어진 평균과 표준 편차를 기반으로 확률 변수의 분포를 계산할 수 있습니다.

3.3 이항 분포

이항 분포는 독립적인 베르누이 시행을 여러 번 반복하여 성공하는 횟수를 나타내는 확률 분포입니다. 주어진 시행 횟수 (n)와 성공 확률 (p)에 따라서 이항 분포의 확률 값을 계산할 수 있습니다.

이항 분포의 확률 질량 함수 (PMF)는 다음과 같이 정의됩니다.

import scipy.special

def binomial_pmf(k, n, p):
    """
    이항 분포 확률 질량 함수를 계산하는 함수

    Parameters:
    - k : 성공 횟수
    - n : 시행 횟수
    - p : 성공 확률

    Returns:
    - 이항 분포 확률 질량 함수 값
    """
    binom_coefficient = scipy.special.comb(n, k)
    success_prob = p ** k
    failure_prob = (1 - p) ** (n - k)
    return binom_coefficient * success_prob * failure_prob

위의 코드는 이항 분포의 확률 질량 함수를 계산하는 Python 함수입니다. 함수는 성공 횟수 k, 시행 횟수 n, 그리고 성공 확률 p를 입력으로 받습니다. 함수는 주어진 입력 값들을 기반으로 이항 분포의 확률 값을 계산합니다.

이를 예시로 살펴보면, 시행 횟수가 10이고 성공 확률이 0.5인 이항 분포의 확률 질량 함수를 사용해 4번의 성공 확률을 계산할 수 있습니다.

>>> binomial_pmf(4, 10, 0.5)
0.205078125

동일한 이항 분포에서 7번의 성공 확률을 계산할 수도 있습니다.

>>> binomial_pmf(7, 10, 0.5)
0.1171875

이처럼 이항 분포의 확률 질량 함수를 사용하면 주어진 시행 횟수와 성공 확률을 기반으로 성공 횟수의 분포를 계산할 수 있습니다.

3.4 다항 분포

다항 분포는 여러 개의 베르누이 시행을 독립적으로 반복하여 다양한 카테고리에 속하는 횟수를 나타내는 확률 분포입니다. 다항 분포는 주어진 시행 횟수 (n)와 카테고리의 개수 (k), 그리고 각 카테고리의 성공 확률 (p1, p2, ..., pk)에 따라서 확률 값을 계산할 수 있습니다.

다항 분포의 확률 질량 함수 (PMF)는 다음과 같이 정의됩니다.

import scipy.special

def multinomial_pmf(k_list, n, p_list):
    """
    다항 분포 확률 질량 함수를 계산하는 함수

    Parameters:
    - k_list : 카테고리에 속하는 횟수 리스트
    - n : 시행 횟수
    - p_list : 카테고리 별 성공 확률 리스트

    Returns:
    - 다항 분포 확률 질량 함수 값
    """
    mult_coefficient = scipy.special.comb(n, k_list)
    success_prob = [p ** k for p, k in zip(p_list, k_list)]
    return mult_coefficient * np.prod(success_prob)

위의 코드는 다항 분포의 확률 질량 함수를 계산하는 Python 함수입니다. 함수는 카테고리에 속하는 횟수 리스트 k_list, 시행 횟수 n, 그리고 카테고리 별 성공 확률 리스트 p_list를 입력으로 받습니다. 함수는 주어진 입력 값들을 기반으로 다항 분포의 확률 값을 계산합니다.

예를 들어, 카테고리의 개수가 3이고 시행 횟수가 10인 다항 분포에서 각 카테고리의 성공 확률이 0.3, 0.4, 0.3일 때, 첫번째 카테고리에 2번, 두번째 카테고리에 4번, 세번째 카테고리에 3번 속하는 확률을 계산할 수 있습니다.

>>> multinomial_pmf([2, 4, 3], 10, [0.3, 0.4, 0.3])
0.11340000000000002

이를 통해 다항 분포의 확률 질량 함수를 사용하여 주어진 시행 횟수와 성공 확률을 기반으로 각 카테고리에 속하는 횟수의 분포를 계산할 수 있습니다.

3.5 베타 분포 (Beta Distribution)

베타 분포는 0과 1 사이의 값을 가지는 연속 확률 분포입니다. 주로 베르누이 분포의 확률 모수(p)에 대한 사전 분포로서 사용되며, 베이지안 추론에서 사후 분포를 계산하기 위해 많이 사용됩니다.

베타 분포의 확률 밀도 함수 (PDF)는 다음과 같이 정의됩니다.

import numpy as np
import scipy.stats as stats

def beta_pdf(x, a, b):
    """
    베타 분포 확률 밀도 함수를 계산하는 함수

    Parameters:
    - x : 계산할 확률 변수 값
    - a : 베타 분포의 모수 a
    - b : 베타 분포의 모수 b

    Returns:
    - 베타 분포 확률 밀도 함수 값
    """
    return stats.beta.pdf(x, a, b)

위의 코드는 베타 분포의 확률 밀도 함수를 계산하는 Python 함수입니다. 함수는 계산할 확률 변수 값 x와 베타 분포의 모수 ab를 입력으로 받습니다. 함수는 주어진 입력 값들을 기반으로 베타 분포의 확률 밀도 함수 값을 계산합니다.

예를 들어, 베타 분포의 모수 a=2, b=5일 때, 확률 변수 x=0.3일 때의 확률 밀도 함수 값을 계산할 수 있습니다.

>>> beta_pdf(0.3, 2, 5)
1.2600000000000002

이를 통해 베타 분포의 확률 밀도 함수를 사용하여 주어진 모수 값에 따른 확률 변수의 분포를 계산할 수 있습니다.

3.6 감마 분포 (Gamma Distribution)

감마 분포는 양의 실수 값을 가지는 연속 확률 분포입니다. 주로 양의 값에 대한 확률 변수를 모델링하기 위해 사용되며, 특히 시간이나 걸리는 작업의 소요 시간과 관련된 문제에 많이 활용됩니다.

감마 분포의 확률 밀도 함수 (PDF)는 다음과 같이 정의됩니다.

import numpy as np
import scipy.stats as stats

def gamma_pdf(x, k, theta):
    """
    감마 분포 확률 밀도 함수를 계산하는 함수

    Parameters:
    - x : 계산할 확률 변수 값
    - k : 감마 분포의 모수 k(형상 매개변수)
    - theta : 감마 분포의 모수 theta(척도 매개변수)

    Returns:
    - 감마 분포 확률 밀도 함수 값
    """
    return stats.gamma.pdf(x, k, scale=theta)

위의 코드는 감마 분포의 확률 밀도 함수를 계산하는 Python 함수입니다. 함수는 계산할 확률 변수 값 x와 감마 분포의 모수 ktheta를 입력으로 받습니다. 함수는 주어진 입력 값들을 기반으로 감마 분포의 확률 밀도 함수 값을 계산합니다.

예를 들어, 감마 분포의 모수 k=2, theta=3일 때, 확률 변수 x=1.5일 때의 확률 밀도 함수 값을 계산할 수 있습니다.

>>> gamma_pdf(1.5, 2, 3)
0.09459378442055249

이를 통해 감마 분포의 확률 밀도 함수를 사용하여 주어진 모수 값에 따른 확률 변수의 분포를 계산할 수 있습니다.

3.7 지수 분포 (Exponential Distribution)

지수 분포는 사건들이 특정한 시간 간격을 따라 발생하는 경우에 활용되는 연속 확률 분포입니다. 예를 들어, 어떤 사건이 평균적으로 10분에 한 번씩 발생한다면, 해당 사건이 다음번에 발생할 때까지 걸리는 시간은 지수 분포를 따르게 됩니다.

지수 분포의 확률 밀도 함수 (PDF)는 다음과 같이 정의됩니다.

import numpy as np
import scipy.stats as stats

def exponential_pdf(x, lambda_):
    """
    지수 분포 확률 밀도 함수를 계산하는 함수

    Parameters:
    - x : 계산할 확률 변수 값
    - lambda_ : 지수 분포의 모수 lambda(비율 매개변수)

    Returns:
    - 지수 분포 확률 밀도 함수 값
    """
    return stats.expon.pdf(x, scale=1/lambda_)

위의 코드는 지수 분포의 확률 밀도 함수를 계산하는 Python 함수입니다. 함수는 계산할 확률 변수 값 x와 지수 분포의 모수 lambda_를 입력으로 받습니다. 함수는 주어진 입력 값들을 기반으로 지수 분포의 확률 밀도 함수 값을 계산합니다.

예를 들어, 지수 분포의 모수 lambda=0.5일 때, 확률 변수 x=2일 때의 확률 밀도 함수 값을 계산할 수 있습니다.

>>> exponential_pdf(2, 0.5)
0.06766764161830635

이를 통해 지수 분포의 확률 밀도 함수를 사용하여 주어진 모수 값에 따른 확률 변수의 분포를 계산할 수 있습니다.

3.8 로지스틱 함수 (Logistic Function)

로지스틱 함수는 실수를 입력으로 받아 0과 1 사이의 값을 반환하는 S자 형태의 형태로 변환해주는 함수입니다. 주로 이진 분류 문제에서 사용되며, 선형 회귀 모델의 출력을 확률로 변환하기 위해 사용됩니다.

로지스틱 함수의 수식은 다음과 같이 정의됩니다.

import numpy as np

def logistic_function(x):
    """
    로지스틱 함수를 계산하는 함수

    Parameters:
    - x : 계산할 값

    Returns:
    - 로지스틱 함수 계산 결과
    """
    return 1 / (1 + np.exp(-x))

위의 코드는 로지스틱 함수를 계산하는 Python 함수입니다. 함수는 계산할 값 x를 입력으로 받아 로지스틱 함수의 결과값을 반환합니다.

예를 들어, x=2일 때 로지스틱 함수의 값을 계산하면 다음과 같습니다.

>>> logistic_function(2)
0.8807970779778823

로지스틱 함수는 이진 분류에서 확률로 변환하기 위해 주로 사용되며, 이를 통해 입력 값에 따른 확률을 추정할 수 있습니다.

3.9 소프트맥스 함수 (Softmax Function)

소프트맥스 함수는 다중 클래스 분류 문제에서 사용되는 확률 함수입니다. 소프트맥스 함수는 입력된 벡터를 총합이 1이 되도록 변환하여 각 클래스에 속할 확률을 계산합니다.

소프트맥스 함수의 수식은 다음과 같이 정의됩니다.

import numpy as np

def softmax_function(x):
    """
    소프트맥스 함수를 계산하는 함수

    Parameters:
    - x : 계산할 값 (벡터 형태)

    Returns:
    - 소프트맥스 함수 계산 결과
    """
    exp_values = np.exp(x - np.max(x))  # 입력 값을 안정적으로 처리하기 위해 최댓값을 뺀 후 지수 함수를 적용
    return exp_values / np.sum(exp_values)  # 소프트맥스 함수의 계산 결과 반환

위의 코드는 소프트맥스 함수를 계산하는 Python 함수입니다. 함수는 계산할 값 x를 입력으로 받아 소프트맥스 함수를 적용한 결과를 반환합니다.

예를 들어, x=[3, 1, 0.2]일 때 소프트맥스 함수의 값을 계산하면 다음과 같습니다.

>>> softmax_function([3, 1, 0.2])
array([0.8360188 , 0.11314284, 0.05083836])

각 클래스의 확률 값을 계산하여 반환합니다. 소프트맥스 함수는 다중 클래스 분류에서 주로 사용되며, 클래스마다 속할 확률 값을 추정할 수 있습니다.

3.10 로그-정규 분포 (Log-Normal Distribution)

로그-정규 분포는 로그를 취한 값이 정규 분포를 따를 때 사용되는 확률 분포입니다. 일반적으로 양수 값을 가지는 데이터의 분포를 모델링하는 데 사용됩니다.

로그-정규 분포의 확률 밀도 함수(PDF)는 다음과 같이 정의됩니다.

import numpy as np

def log_normal_pdf(x, mu, sigma):
    """
    로그-정규 분포의 확률 밀도 함수 계산

    Parameters:
    - x : 계산할 값
    - mu : 평균
    - sigma : 표준편차

    Returns:
    - 로그-정규 분포의 확률 밀도 함수 값
    """
    exponent = -((np.log(x) - mu) ** 2) / (2 * sigma ** 2)
    denominator = x * sigma * np.sqrt(2 * np.pi)
    return np.exp(exponent) / denominator

위 코드는 로그-정규 분포의 확률 밀도 함수를 계산하는 Python 함수입니다. 함수는 계산할 값 x, 평균 mu, 표준편차 sigma를 입력으로 받아 로그-정규 분포의 확률 밀도 함수 값을 반환합니다.

예를 들어, x=4, mu=2, sigma=0.5일 때 로그-정규 분포의 확률 밀도 함수 값을 계산하면 다음과 같습니다.

>>> log_normal_pdf(4, 2, 0.5)
0.3520653267642995

로그-정규 분포는 양수 값을 가지는 데이터의 분포를 모델링할 때 유용하게 사용됩니다.

3.11 포아송 분포 (Poisson Distribution)

포아송 분포는 일정한 시간 또는 공간 내에서 발생하는 이벤트가 얼마나 자주 발생하는지를 모델링하는데 사용되는 이산 확률 분포입니다. 주로 특정 시간 동안 발생하는 사건의 수를 분석할 때 사용됩니다.

포아송 분포의 확률 질량 함수(PMF)는 다음과 같이 정의됩니다.

import math

def poisson_pmf(k, lambd):
    """
    포아송 분포의 확률 질량 함수 계산

    Parameters:
    - k : 계산할 사건의 수
    - lambd : 사건의 평균 발생 횟수

    Returns:
    - 포아송 분포의 확률 질량 함수 값
    """
    return math.exp(-lambd) * lambd**k / math.factorial(k)

위 코드는 포아송 분포의 확률 질량 함수를 계산하는 Python 함수입니다. 함수는 계산할 사건의 수 k와 사건의 평균 발생 횟수 lambd를 입력으로 받아 포아송 분포의 확률 질량 함수 값을 반환합니다.

예를 들어, k=3, lambd=2일 때 포아송 분포의 확률 질량 함수 값을 계산하면 다음과 같습니다.

>>> poisson_pmf(3, 2)
0.18044704431548356

포아송 분포는 주로 사건의 발생 빈도를 모델링할 때 사용됩니다. 특히, 특정 시간 동안에 얼마나 많은 사건이 발생할지를 예측하는데 유용합니다.

4. 마무리

확률 함수는 머신 러닝에서 매우 중요한 개념이며, 다양한 분야에서 활용되고 있습니다. 이번 블로그에서는 머신 러닝에서 사용되는 주요 확률 함수들을 소개했습니다.

머신 러닝 알고리즘의 성능 향상을 위해서는 이러한 확률 함수들을 잘 이해하고 활용하는 것이 필요합니다. 확률 함수의 개념과 특성에 대한 이해를 바탕으로, 우리는 다양한 데이터에 대한 확률 모델링을 수행할 수 있고, 예측 결과의 신뢰성을 높일 수 있습니다.

또한, 확률 함수의 종류와 예시에 대한 소개를 통해 여러 확률 분포를 살펴보았습니다. 각 분포는 특정한 현상이나 데이터에 적합하게 설계된 모델이며, 이를 이해하고 적절하게 활용함으로써 다양한 데이터 분석 및 예측 문제에 대응할 수 있습니다.

머신 러닝에서 확률 함수의 활용은 매우 광범위하며, 계속해서 연구와 발전이 진행되고 있습니다. 따라서, 머신 러닝을 공부하고 실제 문제에 적용하는 과정에서 확률 함수에 대한 이해와 활용력을 계속해서 키워나가야 합니다.

이번 블로그를 통해 확률 함수에 대한 기본적인 내용과 대표적인 예시들을 다루어보았습니다. 각각의 확률 함수들에 대한 더 깊은 이해와 실제 적용에 대해서는 해당 확률 분포의 특성과 활용 예시들을 더 찾아보시기를 추천합니다.

머신 러닝에서 확률 함수의 역할과 중요성을 이해하고, 다양한 확률 함수들을 활용하는 방법을 습득한다면 보다 정확하고 신뢰성 높은 예측 모델을 구축할 수 있을 것입니다. 이를 통해 데이터 분석과 예측에 대한 효과적인 의사결정을 할 수 있을 것입니다.

https://gboysking.net 

 

G-ChatBot

Our service is an AI chatbot service developed using OpenAI API. Our service features a user-friendly interface, efficient management of token usage, the ability to edit conversation content, and management capabilities.

gboysking.net

이 게시글은 ChatGPT (G-ChatBot)의 도움으로 작성하였습니다.

반응형