클라우드 기초

 

클라우드 컴퓨팅 서비스를 제공받기 전에는 서비스 제공자는 서비스 호스팅에 필요한 다음과 같은 모든 것들을 직접 구축하였다.

 

  • 데이터 센터 (물리적 공간)
  • 서버, 저장소
  • 네트워크 방화벽, 보안
  • 운영체제, 기타 개발도구
  • 전기, 온도, 습도 관리
  • 운영 / 관리 인력

그러나 서버를 직접 구축하고 운영하는 자원과 인력 비용이 크고 운영 상황의 변화에 능동적 대응이 어려웠다.

그래서 회사나 조직이 직접 모든 것을 구축하고 운영하지 않도록 도와주는

IDC(Internet Data Center)가 등장하였다.

IDC는 서버 운영에 필요한 공간, 네트워크, 유지 보수 등의 서비스를 제공한다.

IDC 입주자가 직접 서버를 구입해 들어오기도 하지만 불필요한 자원 혹은 유휴 자원이 발생하기 때문에 IDC에서 직접 서버를 임대해주기도 한다.

 

서버 임대를 통해 자원을 효율적으로 이용하고 비용을 줄일 수 있었지만 대부분 IDC의 서버 임대는 계약을 통해 일정 기간 임대를 하는 유연성이 떨어지는 구조였다.

 

인터넷 사용자가 크게 증가하고, 다양한 서비스를 제공하게 되며 필요한 때에 필요한 만큼 서버를 증설하길 원하는 온디맨드의 수요가 증가하게 된다.

 

ex)

사용자 접속량이 늘어나 컴퓨팅 수요가 증가할 때는 오토 스케일링이 필요

평상 시에 사용하지 않는 유휴 자원은 비용에서 빼주어야 한다

필요한 시점에서 바로 사용할 수 있게 운영체제나 필요한 소프트웨어는 미리 설치해주도록 한다

 

그러면서 등장하게 된 것이 바로 Cloud Computing이다.

Cloud Computing은 "인터넷 기반 컴퓨팅의 일종"이라고 부른다.

2006년 아마존이 클라우드를 통한 저장공간 및 연산 자원 제공 서비스인 S3와 EC2를 개시하며 본격적인 클라우드 컴퓨팅 시대가 개막이 되었다.

 

AWS는 클라우드 컴퓨팅을 클라우드 서비스 플랫폼에서 컴퓨팅 파워, DB 저장공간, 애플리케이션 및 기타 IT 자원을 필요에 따라 인터넷을 통해 제공하고 사용한 만큼만 비용을 지불하는 것으로 정의하였다.

 

4차 산업혁명 시대에서는 빅데이터의 수집, 저장, 분석을 위한 방대한 컴퓨팅 자원이 필요하고, 인공지능 개발을 위한 고성능 컴퓨터가 필요한데 이 모든 것을 별도로 구입하지 않고도 적은 비용으로 빠르게 필요한 IT 환경 마련을 가능하게 해주어 클라우드 컴퓨팅이 더더욱 중요시되고 있다.

 

클라우드 컴퓨팅은 다음과 같은 장점을 갖는다.

 

  • 속도 - 주문형 셀프서비스
    • 클라우드 제공자와 별도의 커뮤니케이션 없이 원하는 클라우드 서비스를 바로 이용 가능하게 한다.
  • 접근성
    • 인터넷을 통해 사용자의 위치, 시간과 관계없이 어떤 디바이스로도 접근이 가능하다.
  • 확장성
    • 갑작스러운 이용량 증가나 변화에 신속하고 유연하게 추가 확장이 가능하다.
  • 생산성
    • 하드웨어, 소프트웨어 설치에 들어가는 시간과 비용 절감으로 핵심업무에 집중할 수 있게 해준다.
  • 보안, 안정성
    • 클라우드 공급자가 전체적으로 보안이나 안정성에 대해 준비해준다.
  • 측정가능성
    • 분초 단위로 사용자가 클라우드 서비스를 사용한만큼만 계량하여 과금하여 효율적인 소비가 가능하다.

 

클라우드 컴퓨팅은 구축 및 배포 유형에 따라 세 가지 형태로 구분한다.

 

  • 프라이빗 (Private) 
    • 고객이 자체 데이터센터에서 직접 클라우드 서비스를 구축하는 형태이다.
    • 내부 계열사나 고객에게만 제공하여 인프라 확충은 쉬우나 IT 기술 확보가 어려운 단점이 있다.
    • 보안이 좋고 커스터마이제이션이 가능하며 글로벌 클라우드 사업자가 IT 기술만 패키지형태로 판매하기도 한다.
  • 퍼블릭 (Public)
    • 서비스 유지를 위한 모든 인프라와 IT 기술을 클라우드에서 사용한다.
    • AWS, GCP, Azure와 같은 외부 클라우드 컴퓨팅 사업자가 IT 자원을 소유하고 인터넷을 통해 제공한다.
    • IT 관리 인력이나 인프라 구축 비용이 없는 경우에 유용하다.
  • 하이브리드 (Hybrid)
    • 고객의 핵심 시스템은 내부에 두면서 외부의 클라우드를 활용하는 형태이다.
    • IT 기술은 클라우드에서 받고 서비스 유지를 위한 인프라는 고객의 것을 혼용한다.
    • 퍼블릭의 경제성과 프라이빗의 보안성을 모두 고려한 형태이다.

 

클라우드 서비스 제공 방식에 따라 모델이 다음과 같이 달라지게 된다.

 

그림 출처 : www.whatap.io/ko/blog/9/

클라우드 서비스 제공 모델

 

이를 자동차로 예를 들면 다음과 같다.

 

  • On-Premises
    • Owning a car
    • 차 관리부터 운전, 목적지 결정까지 모든 것을 차주인 내가 해야 한다.
  • IaaS
    • Leasing a car
    • 운전만 직접 하고, 목적지만 정하면 된다.
  • PaaS
    • Taking a taxi
    • 목적지만 정하면 된다.
  • SaaS
    • Going by bus
    • 버스가 알아서 정해져있는 목적지까지 가준다.

AWS를 사용할 환경을 세팅하여 보자

 

ec2 생성

 

1. AMI 선택

 

딥러닝 AMI가 설치된 EC2를 생성해 필요 개발 환경 사전 세팅 

 

검색 부분에 Deep learning 입력

 

 

2. 인스턴스 유형 선택 & 보안 그룹 설정

 

프리티어인 t2.micro 또는 computing에 최적화된 가장 저렴한 c5.large 인스턴스 유형 선택 후 "다음 : 인스턴스 세부정보 구성" 클릭

 

"단계 6 : 보안그룹 구성"이 나올 때까지 계속 다음 클릭

 

원격으로 API 서버에 접근 / 호출할 수 있도록 사용자 설정 포트를 새로 생성 (ex. 포트범위 : 5000, 소스 0.0.0.0/0) 후 검토 및 시작

 

 

3. 키 페어 생성 & 인스턴스 시작 검토

 

보안을 위한 키 페어 생성을 위해 키 페어 이름을 입력하고 "키 페어 다운로드"를 클릭해 키 페어 다운로드

 

다운로드한 키 페어는 이후 인스턴스에 접속하기 위해 필요

 

인스턴스 시작

 


탄력적 IP 설정

 

1. 탄력적 IP 생성

 

인스턴스를 중지 또는 종료 후 다시 시작하거나 생성하게 되면 기존 퍼블릭 IP가 변경됨

 

퍼블릭 IP를 고정으로 사용하고 싶을 때 탄력적 IP 주소를 할당할 수 있으나 추가 과금 발생

 

탄력적 IP 생성을 위해 "탄력적 IP 주소 할당" 클릭

 

 

 

2. 탄력적 IP를 인스턴스에 연결

 

 

3. 연결 확인

 


VS Code로 환경 테스트

 

1. 인스턴스 연결 초기화(Initialization)

 

다운로드 받은 키 페어가 있는 위치에서 AWS 가이드에 따라 진행

 

Mac OS 또는 Linux는 자체 터미널로 바로 수행 가능

 

Windows는 OpenSSH 클라이언트 설치 후 CMD 또는 PowerShell에서 진행 가능

 

 

2. 원격 접속 및 개발을 위한 VS Code 플러그인 설치

 

 

3. 인스턴스에 접속

 

Remote-SSH : Connect to Host 선택

 

ssh -i "암호키" ubuntu@public-ip-address 입력

 

Select SSH configuration file

 

4. 터미널 열고 환경 확인

 

터미널에서 "conda env list"로 세팅되어 있는 가상환경 확인

 

(Winodws 환경에서 실습 실패....)


API to serve ML model

 

Architecture of API to serve ML model

 

AWS EC2와 Python Flask 기반 모델 학습 및 추론을 요청/응답하는 API 서버 개발

 

그림 출처 : 프로그래머스 스쿨

 

사용자는 기계와 소프트웨어를 제어하기 위해 인터페이스를 정해진 매뉴얼에 따라 활용해 원하는 경험을 획득한다.

인터페이스는 상호 합의된 매뉴얼에 따라 적절한 입력을 받아 기대되는 출력을 제공할 수 있어야 한다.

 

API(Application Programming Interface)란? 기계와 기계, 소프트웨어와 소프트웨어 간 커뮤니케이션을 위한 인터페이스를 의미한다.

 

노드와 노드 간 데이터를 주고 받기 위한 인터페이스로, 사전에 정해진 정의에 따라 입력이 들어왔을 때 적절한 출력을 전달해야 한다.

 

RESTful API는 REST 아키텍처를 따르는 API로, HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 필요한 연산을 요청하고 반환하는 API를 지칭한다.

RESTful API는 데이터나 정보의 교환/요청 등을 위한 인터페이스를 REST 아키텍처를 따라 구현한 API이다.

 

ML/DL model inference

 

일반적으로 데이터 값을 담아 요청하고 모델이 추론한 결과에 대한 return을 json 형태로 보통 반환하도록 설계한다.

RESTful API는 요청 메시지만 봐도 어떤 내용으로 되어있는지 알 수 있도록 표현된다. 즉, 메세지만 봐도 object를 detect하는 API인지 Pose estimation의 API인지 등 모델의 종류를 대략적으로 파악이 가능하고, 어떤 정보들을 제공받을 수 있는지 알 수 있다.

 

문제정의, 데이터 준비, 모델 학습 및 검증, 모델 배포, 모니터링 등의 과정을 통해 실제 서비스에 기계학습 모델을 적용할 수 있다.

 

학습된 모델을 REST API 방식으로 배포하기 위해선 학습된 모델의 Serialization과 웹 프레임워크를 통해 배포 준비가 필요하다.

모델을 Serving할 때는 학습 시 데이터 분포나 처리 방법과의 연속성 유지가 필요하며, 모델을 배포하는 환경에 따라 다양한 Serving Framework를 고려해 활용해야 한다.

 

Serialization이란? 학습된 모델의 재사용 및 배포를 위해 저장하고 불러오는 것이다. 

Serialization을 통해 ML/DL model object를 disk에 write하여 어디든 전송하고 불러올 수 있는 형태로 변환하고,

De-Serialization을 통해 Python 혹은 다른 환경에서 model을 불러와 추론/학습에 사용한다.

모델을 배포하는 환경을 고려해 환경에 맞는 올바른 방법으로 Serialization을 해야 De-serialization이 가능하다.

 

모델은 단순히 Feature Engineering 과정을 통해 입력한 데이터를 Feature의 형태로 반환하여 준다. 보통 Feature는 숫자 형태로 조합되어 있는데 결과 또한 수치적 형태기 때문에 API 서비스로 제공을 할 때는 결과값에 대한 정보를 Labeling하거나 결과에 대한 후처리 작업을 해야한다. 이러한 일련의 과정을 Handler(후처리 뿐만 아니라 초기화, 전처리 등도...)를 통해 수행하도록 해준다.

 

딥러닝 모델의 안정적인 Serving을 위해선 Tensorflow serving, TrochServe, TensorRT같은 프레임워크를 사용하는 것이 일반적이다. (전용 serving tool) 대용량 데이터 배치처리와 딥러닝 모델의 활용이 늘며 multi node, multi GPU 환경에서의 안정적인 모델 서빙을 위함이다. 

 

Flask와 같은 웹프레임워크는 클라이언트로부터 요청을 처리하기 위해 주로 사용한다. (외부 통신)

별도의 모델 추론을 위한 API 서버를 운용해 내부 혹은 외부 통신을 통해 예측/추론값을 반환한다.


Serialization & De-serialization

 

실제로 모델을 배포해보자.

 

# 아나콘다 가상환경 실행

conda activate pytorch_p36

# template 소스코드 다운로드

git clone https://github.com/sackoh/kdt-ai-aws
cd ./kdt-ai-was

# 필요 라이브러리 설치

pip install -r requirements.txt

 

사전 준비한 코드를 실행해 모델 학습 및 저장

 

python train_ml.py

 

serialization code 확인

 

def serialization(model, vectorizer):
    import joblib
    os.makedirs('model', exist_ok=True)
    joblib.dump(vectorizer, 'model/ml_vectorizer.pkl')
    logger.info(f'Saved vectorizer to `model/ml_vectorizer.pkl`')
    joblib.dump(model, 'model/ml_model.pkl')
    logger.info(f'Saved model to `model/ml_model.pkl`')

 

joblib 패키지를 통해 model을 지정한 경로에 저장한 것을 확인할 수 있다.

 

de-serialization code 확인

 

저장된 모델을 불러와 특정 입력 값에 대한 예측을 수행하게 된다.

 

  1. 터미널 환경에서 python 또는 ipython, jupyter notebook 실행
  2. 아래 예제 코드 테스트하여 de-serialization 확인
# De-serialization
import joblib
model = joblib.load('model/ml_model.pkl')
vectorizer = joblib.load('model/ml_vectorizer.pkl')

# Test loaded model and vectorizer
text = '재미있는 영화입니다.'

model_input = vectorizer.transform([text])
print(model_input.asformat('array'))
# <1x100000 sparse matrix of type '<class 'numpy.int64'>' with 2 stored elements in Compressed Sparse Row format

model_output = model.predict_proba(model_input)
print(model_output)
# array([0.02610797, 0.97389203])
model_output = model_output.argmax(axis=1)
print(model_output)
# array([1])
id2label = {0 : 'negative', 1 : 'positive'}
print(f'sentiment : {id2label[model_output[0]]}')
# sentiment : positive

 

Serialization과 De-serialization 방법은 동일해야 한다.

joblib으로 serialization을 하고 pickle로 불러올 수 없다.


Inference를 위한 model handler 개발

 

Skeleton of model handler to serve model

class ModelHandler:
	def __init__(self):
    	self.id2label = {0: 'negative', 1: 'positive'}
        
    def _clean_text(self, text): # data 전처리 함수
    	pass
        
class MLModelHandler(BaseHandler):
	def __init__(self):
    	super().__init__()
        self.initialize()
    
    def initialize(self, **kwargs):
    	# De-serializing model and loading vectorizer
        import joblib
        self.model = joblib.load('model/ml_model.pkl')
        self.vectorizer = joblib.load('model/ml_vectorizer.pkl')
    
    def preprocess(self, text):
    	# cleansing raw text
        model_input = self._clean_text(text)
        
        # vectorize cleaned text
        model_input = self.vectorizer.transform(model_input)
        return model_input
    
    def inference(self, data): #불러온 모델에 대해 추론
        # get predictions from model as probabilities
    	model_output = self.model.predict_proba(model_input)
        return model_output
    
    def postprocess(self, data):
    	# process predictions to predicted label and output format
        predicted_probabilities = model_output.max(axis=1)
        predicted_ids = model_output.argmax(axis=1)
        predicted_labels = [self.id2label[id_] for id_ in predicted_ids]
        return predicted_labels, predicted_probabilities
    
    def handle(self, data): #일련의 과정을 handle. api에서는 이 부분만 call하게 된다.
        # do above processes
    	model_input = self.preprocess(data)
        model_output = self.inference(model_input)
        return self.postprocess(model_output)
        
        
# handler 수행 (cmd)

from model import MLModelHandler
ml_hanlder = MLModelHandler()

text = ["정말 재밌는 영화다.", "정말 재미없다."]
result = ml_handler.handle(text)
print(result)
# (['positive', 'negative'], array([0.98683823, 0.79660478])

 

  • initialize()
    • 데이터 처리나 모델, configuration 등 초기화
      • Configuration 등 초기화
      • (Optional) 신경망 구성하고 초기화
      • 사전 학습한 모델이나 전처리기 불러오기 (De-serialization)
        • 모델을 불러올 땐 전역변수로 불러와야 한다. inference 할 때마다 모델을 불러오도록 하면 그로 인해 발생하는 시간이나 자원 등의 낭비 발생
        • 일반적으로 요청 처리 전 모델을 불러 둔다.
  • preprocess()
    • Raw input을 전처리 및 모델 입력 가능 형태로 변환
      • Raw input 전처리
        • 데이터 cleansing의 목적과 학습된 모델 학습 당시 scaling이나 처리 방식과 맞춰주는 것이 필요하다.
      • 모델에 입력가능한 형태로 변환
        • vectorization, converting to id 등의 작업
  • inference()
    • 입력된 값에 대한 예측 / 추론
      • 각 모델의 predict 방식으로 예측 확률분포 값 반환
  • postprocess()
    • 모델의 예측값을 response에 맞게 후처리 작업
      • 예측된 결과에 대한 후처리 작업
      • 보통 모델이 반환하는 건 확률분포와 같은 값이기 때문에 response에서 받아야 하는 정보로 처리하는 역할을 많이 함.
  • handle()
    • 요청 정보를 받아 적절한 응답 반환
      • 정의된 양식으로 데이터가 입력됐는지 확인
      • 입력 값에 대한 전처리 및 모델에 입력하기 위한 형태로 변환
      • 모델 추론
      • 모델 반환값의 후처리 작업
      • 결과 반환

Flask 기반 감성분석 API 개발

 

네이버 영화리뷰 감성분석 개요

 

나이브베이지안 모델과 딥러닝 모델로 학습한 두 개의 모델을 서빙하며 0은 부정, 1은 긍정 의미.

학습에 사용한 데이터는 박은정 님이 공개한 NSMC 데이터

 

감성분석 API 개발 방향

 

영화 리뷰 텍스트 POST predict 요청

 

ex) 영화가 재미없어요.

 

 

do_fast 요청 정보에 따라 ML 또는 DL 모델로 예측

 

 

감성분석 결과 반환

 

ex)

 

{ "text" : "영화가 재미없어요.",

"label" : "negative",

"confidence" : 0.89231 } 

 

 

API 정의

 

key : value 형태의 json 포맷으로 요청을 받아 text index 별로 key : value로 결과를 저장한 json 포맷으로 결과 반환

 

POST 방식으로 predict 요청

do_fast true로 할 경우 빠른 추론이 가능한 ML 모델로 추론,

false의 경우 추론 속도는 비교적 느리지만 정확도가 높은 DL 모델로 추론.

 

Add Deep Learning model handler

 

(앞에서 만든건 Machine Learning model handler)

 

사전 학습한 딥러닝 모델을 활용해 머신러닝 모델 handler와 동일한 입력에 대해 동일한 결과를 반환하는 handler 개발

사전 학습한 모델은 Hugging Face에서 제공하는 외부 저장소에서 다운로드 받아 불러옴

 

import torch

class DLModelHandler(ModelHandler):
    def initialize(self, ):
        # De-serializing model and loading vectorizer
        from transformers import AutoTokenizer, AutoModelForSequenceClassification
        self.model_name_or_path = 'sackoh/bert-base-multilingual-cased-nsmc'
        self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path)
        self.model = AutoModelForSequenceClassification.from_pretrained(self.model_name_or_path)
        self.model.to('cpu')

    def preprocess(self, text):
        # preprocess raw text
        model_input = self._clean_text(text)

        # vectorize cleaned text
        model_input = self.tokenizer(text, return_tensors='pt', padding=True)
        return model_input

    def inference(self, model_input):
        with torch.no_grad():
            model_output = self.model(**model_input)[0].cpu()
            model_output = 1.0 / (1.0 + torch.exp(-model_output))
            model_output = model_output.numpy().astype('float')
        return model_output
    
    def postprocess(self, data):
    	# process predictions to predicted label and output format
        predicted_probabilities = model_output.max(axis=1)
        predicted_ids = model_output.argmax(axis=1)
        predicted_labels = [self.id2label[id_] for id_ in predicted_ids]
        return predicted_labels, predicted_probabilities
    
    def handle(self, data): 
    	model_input = self.preprocess(data)
        model_output = self.inference(model_input)
        return self.postprocess(model_output)

 

Unittest model handlers

 

개발한 model handler가 원했던 대로 동작하는지 unittest

 

(terminal)

 python -m unittest -v test_model_handler.py

 

Flask API 개발 & 배포

 

from flask import Flask, request, json
from model import MLModelHandler, DLModelHandler

app = Flask(__name__)

# assign model handler as global variable
ml_handler = MLModelHandler()
dl_handler = DLModelHandler()

@app.route("/predict", methods=["POST"])
def predict():
	# handle request and body
    body = request.get_json()
    text = body.get('text', '')
    text = [text] if isinstance(text, str) else text
    do_fast = body.get('do_fast', True)
    
	# model inference
    if do_fast:
    	predictions = ml_handler.handle(text)
    else:
    	predictions = dl_handler.handle(text)
    # predictions => (['positive', 'negative'], array([0.98683823, 0.79660478]))
    
	#response
    result = json.dumps({str(i): {'text' : t, 'label' : l, 'confidence' : c}
    					for i, (t, l, c) in enumerate(zip(text, predictions[0], predictions[1]))})
    return result


if __name__ == "__main__":
    app.run(host="0.0.0.0", port='5000', debug=True)

 

Test API on remote

 

원격에서 서버로 API에 요청하여 테스트 수행

 

host : EC2 인스턴스 생성 시 받은 퍼블릭 IP 주소 또는 직접 할당한 탄력적 IP 주소

port : EC2 인스턴스 생성 시 설정했던 port 번호 (ex. 5000)

 

(terminal)

curl -d '{"text" : ["영화 오랜만에 봤는데 괜찮은 영화였어", "정말 지루했어"], "use_fast" : false}' \
-H "Content-Type: application/json" \
-X POST \
http://host:port/predict
import requests
url = 'http://host:port/predict'
data = {"text" : ["영화 오랜만에 봤는데 괜찮은 영화였어", "정말 지루했어"], "use_fast" : false}
response = requests.post(url, json=data)
print(response.content)

 

'AI > KDT 인공지능' 카테고리의 다른 글

[05/12] EDA mini project  (0) 2021.05.12
[05/12] 데이터 씹고 뜯고 맛보고 즐기기 - EDA  (0) 2021.05.11
[05/10] Web Application with Flask  (0) 2021.05.09
[05/06] Matplotlib  (0) 2021.05.06
[05/05] 데이터 다루기 - Pandas  (0) 2021.05.05

확률 (probability)

 

상대 도수에 의한 정의이다.

 

확률의 고전적 정의

 

  • 표본공간 (sample space)
    • 모든 가능한 실험결과들의 집합
  • 사건 - 대문자로 표현
    • 관심있는 실험결과들의 집합
    • 표본 공간의 부분집합
  • 어떤 사건이 일어날 확률 - P로 표현
    • 표본 공간의 모든 원소가 일어날 확률이 같은 경우
    • 사건의 원소의 수 / 표본공간의 원소의 수
    • 확률은 0에서 1사이의 값을 가짐
      • 1은 무조건 사건이 일어남
      • 0은 절대 사건이 일어나지 않음

 

ex) 주사위를 2번 던졌을 때 합이 10일 확률

 

표본공간 = { ( 1, 1 ), ( 1, 2 ), ( 1, 3 ), ... , ( 6, 6 ) } 총 36가지

 

합이 10일 사건 A = { ( 4, 6 ), ( 5, 5 ), ( 6, 4 ) } 총 3가지

 

확률 P(A) = 3/36 = 1/12

 


확률의 계산

 

조합 (combination)이란? 어떤 집합에서 순서에 상관없이 뽑은 원소의 집합

 

n개 중 r개를 뽑는 조합의 수

 


덧셈 법칙 (Addition Law)

 

  • 사건 A나 사건 B가 일어날 확률
    • P(A∪B)
  • 사건 A와 사건 B가 동시에 일어날 확률
    • P(A∩B)
  • P(A∪B) = P(A) + P(B) - P(A∩B)

 

 

서로 배반 (Mutually Exclusive)

 

  • 두 사건의 교집합이 공집합일 경우 사건 A와 사건 B가 서로 배반한다고 한다.
    • P(A∩B) = 0
    • P(A∪B) = P(A) + P(B)

조건부 확률 (Conditional probability)

 

  • 어떤 사건 A가 일어났을 때, 다른 사건 B가 일어날 확률
  • P(B|A) = P(A∩B)/P(A)
  • 단, P(A) > 0

 

ex) 주사위를 하나 던졌는데, 4이상의 수가 나왔다. 이 때 그 수가 짝수일 확률은?

 

사건 A : 4 이상의 수가 나오는 확률 

사건 B : 짝수가 나오는 사건

 

P(B|A) = P(A∩B)/P(A) = (1/2) / (1/3) = 2/3

 


곱셈 법칙 (Multiplication law)

 

  • P(B|A) = P(A∩B)/P(A)
  • P(A∩B) = P(B|A)P(A)

ex) 어떤 학교에서 60%의 학생이 남학생이다. 그 학교 남학생의 경우 80%는 축구를 좋아한다. 그 학교에서 학생 1명을 랜덤하게 뽑았을 때 축구를 좋아하는 남학생일 확률은?

 

P(A∩B) = P(B|A)P(A) = 0.8 * 0.6 = 0.48

 

서로 독립 (Mutually Independent)

 

  • P(B|A) = P(B)인 경우 사건 A와 B는 서로 독립이라고 한다.
  • P(A∩B) = P(B|A)P(A) = P(B)P(A) = P(A)P(B)

여사건

 

  • 사건 A의 여사건
    • 사건 A가 일어나지 않을 사건
    • A^c로 표시
  • 어떤 사건과 그 여사건은 서로 배반이다. 즉, 둘 중 하나는 반드시 일어난다.
    • P(A∪A^c) = P(A) + P(A^c) = 1
    • P(A) = 1 - P(A^c)

확률의 분할 법칙

 

그림출처 : 프로그래머스 스쿨

 

  • 사건 B는 다음과 같이 나누어진다.
    • B = (A∩B)∪(A^c∩B)
    • (A∩B)와 (A^c∩B)는 서로 배반
    • P(B) = P[(A∩B)∪(A^c∩B)] = P(A∩B)∪P(A^c∩B) = P(B|A)P(A) + P(B|A^c)P(A^c)

 

ex) 어떤 사파리에서 70%가 사자고, 나머지가 호랑이다. 사자는 60%가 2살 이상이고, 호랑이는 40% 정도가 2살 이상이다. 전체 동물 중 2살 이상인 동물의 비율은?

 

사건 A : 동물이 사자인 사건

사건 B : 동물이 2살 이상인 사건

P(B) = P(B|A)P(A) + P(B|A^c)P(A^c) = 0.6 x 0.7 + 0.4 x 0.3 = 0.54

 


베이즈 정리

 

  • 처음의 확률
    • 사전 확률 (prior probability)
  • 수정된 확률
    • 사후 확률 (posterior probability)
  • P(A|B) = P(A∩B) / P(B) = P(B|A)P(A) / P(B|A)P(A) + P(B|A^c)P(A^c)

 

ex) 앞 예제에서 동물 한 마리를 랜덤하게 선택했는데, 이 동물이 2살 이었다. 이 동물이 사자일 확률은?

 

P(A|B) = P(A∩B) / P(B) = P(B|A)P(A) / P(B|A)P(A) + P(B|A^c)P(A^c) = 0.6 x 0.7 / 0.6 x 0.7 + 0.4 x 0.3 = 0.78

 

그림출처 : 프로그래머스 스쿨

 

 

ex) 어떤 사람이 검은색과 흰색의 셔츠를 갖고 있는데, 매일 아침 3/4 정도는 검은색 셔츠를 입고, 1/4 정도는 흰색 셔츠를 입는다. 이 사람이 검은색 셔츠를 입었을 때는 3/4 정도 넥타이를 매고, 흰색 셔츠를 입었을 땐 1/2 정도 넥타이를 맨다 하자. 어느 날 이 사람이 넥타이를 맸다면 이 사람이 검은색 셔츠를 입었을 확률을 구하라.

 

사건 A : 아침에 검은색 셔츠를 입는 사건 P(A) = 3/4

사건 B : 넥타이를 맨 사건 P(B|A) = 3/4, P(B|A^c) = 1/4

 

구하는 확률

 

P(A|B) = (3/4)x(3/4)/(3/4)x(3/4)+(1/2)+(1/4) = 9/11


확률 변수 (random variable)

 

  • 랜덤한 실험 결과에 의존하는 실수. 표본 공간의 부분 집합에 대응하는 실수
  • 보통 표본 공간에서 실수로 대응되는 함수로 정의
  • 보통 X나 Y 같은 대문자로 표시

이산확률변수 (discrete random variable)

 

확률변수가 취할 수 있는 모든 수 값들을 하나씩 셀 수 있는 경우

 

연속확률변수 (continuous random variable)

 

셀 수 없는 경우


확률 분포 (Probability Distribution)

 

확률변수가 가질 수 있는 값에 대해 확률을 대응시켜주는 관계

 

ex) 어떤 확률 변수 X가 가질 수 있는 값 : 0, 1, 2, 3

 

각 값이 나올 확률

 

P(X=0) = 0.5

P(X=1) = 0.2

P(X=2) = 0.2

P(X=3) = 0.1

 

ex) 주사위 2개를 던지는 실험

 

확률 변수 X : 주사위 숫자의 합

 

X가 가질 수 있는 값

 

2, 3, ..., 12

 

P( X = 12 ) = 1 / 36

 

확률 변수 Y : 주사위 숫자의 차

 

Y가 가질 수 있는 값

 

0, 1, 2, ..., 5

 

P( Y = 5 ) = 2 / 36 = 1 / 18

 

확률 변수 X는 주사위를 던질 때마다 값이 달라질 수 있다.

n번 실험하면, n개의 숫자가 나온다. 이 n개의 숫자의 평균과 분산을 계산할 수 있다.

 

즉, 확률 변수 X도 평균과 분산을 갖는다. 이 평균과 분산을 모집단의 평균과 분산이라 할 수 있다.

 

확률분포의 표현

 

표, 그래프, 함수 등 다양하게 표현 가능하다.

 


이산확률변수

 

  • 이산확률변수의 확률분포는 보통 함수로 주어진다.
    • 확률변수 X가 x라는 값을 가질 확률
      • P(X = x) = f(x)
      • 확률질량함수
  • 이산확률변수의 평균
    • 기대값 (expected value)라고도 한다.
    • E(X) = sigma(xP(X=x)x = sigma(xf(x))x

 

ex) 만약 100,000번의 실험을 했다면, 

 

0이 대략 10,000번 나오고,

2이 대략 30,000번 나오고,

5이 대략 60,000번 나왔다고 하면 평균은

 

0X10000 + 2X30000 + 5X60000 / 100000 = 3.6

 

  • 이산확률변수의 분산
    • 실험을 할 때마다 확률변수의 값은 달라진다. 따라서 그 변동의 정도인 분산을 계산할 수 있다.
    • σ^2 = 1/N(N(sigma(x_i-μ)^2)i=1)
    • (X - μ)^2의 평균
    • σ^2 = E[(X - μ)^2] = (sigma(x - μ)^2)P(X = x) = E(X^2) - {E(X)}^2
    • Var(X)라고도 한다.

 

 

ex) 위의 예에서의 분산을 구하면

 

σ^2 = ((0 - 3.6)^2x10,000 + (2 - 3.6)^2x30,000 + (5 - 3.6)^2x60,000)/100,000 = 3.24


결합확률 분포 (Joint probability distribution)

 

두 개 이상의 확률 변수가 동시에 취하는 값들에 대해 확률을 대응시켜주는 관계

 

결합확률분포를 통해 각 확률변수의 확률분포를 도출할 수 있다.

=> 주변확률분포 (marginal probability distribution)


공분산 (Covariance)

 

두 개의 확률변수의 선형 관계를 나타내는 값

 

Cov(X, Y) -= E[(X - μ_x)(Y - μ_y)] = E(XY) - μ_xμ_y = E[XY] - E[X]E[Y]

 


상관계수 (correlation coefficient)

 

공분산은 각 확률 변수의 절대적인 크기에 영향을 받는다. 따라서 단위에 의한 영향을 없앨 필요가 있다.

 

ρ = Corr(X, Y) = Cov(X, Y)/σ_xσ_y


이항분포 

 

베르누이 시행 (Bernoulli trial)

 

정확하게 2개의 결과만을 갖는 실험. ex) 동전 던지기

보통 성공과 실패로 결과를 구분하며, 성공의 확률을 p라고 한다.

 

이항확률변수

 

확률변수 X는 n번의 베르누이 시행에서 성공의 횟수이다. 

 

이항분포(binomail distribution)

 

이항확률변수의 확률분포이다.

 

 

ex) 어떤 랜덤박스의 뽑기 성공 확률이 0.2이다. 3개를 뽑았을 때, 적어도 하나 이상의 성공이 발생할 확률은?

 

 

  • 평균
    • E(X) = np
  • 분산
    • Var(X) = np(1-p)
  • 표준편차
    • SD(X) = root(np(1-p))

정규분포

 

연속확률 변수의 확률 분포. 확률밀도함수(probability density function)로 표현한다.

 

P[a ≤ X ≤ b] = b(integral(f(x)dx))a

 

그래프의 넓이가 확률이 된다.

 

정규분포의 확률밀도함수

 

 

X ~ N (μ, σ^2) => 평균이 μ고, 분산이 σ^2인 정규분포를 따른다는 뜻이다.

 

표준정규확률변수 (standard normal random variable)

 

Z = X - μ / σ

 

 

표준정규분포 (standard normal distribution)

 

Z ~ N (0, 1)

 

표준 정규분포표 => P[Z ≤ z]

 

ex) X~N(4, 3^2)

 

P[X ≤ 4]

= P[X - μ / σ ≤ 4 - μ / σ]

= P[Z ≤ 4-4 / 3] = P[Z ≤ 0]

=0.5

 

ex2)

 

P[4  X ≤ 7]

= P[X ≤ 7] + P[X < 4]

P[Z  7-4 / 3] - P[Z < 0]

= P[Z ≤ 1 ] - P[Z < 0] = 0.8413 - 0.5 = 0.3413


포아송 분포 (Poisson distribution)

 

일정한 시간단위 또는 공간 단위에서 발생하는 이벤트의 수의 확률분포

 

확률분포함수 (확률질량함수)

 

P[X = x] = f(x) = λ^x(e^-λ / x!), x = 0,1, 2, ...

평균 : λ

분산 : λ

 

ex) 어느 웹사이트에 시간당 접속자 수는 평균이 3 (λ = 3)인 포아송 분포를 따른다고 할 때, 앞으로 1시간 동안 접속자 수가 2명 이하일 확률은? 

 

P [X ≤ 2] = P [X = 0] + P [X = 1] + P [X = 2] = 3^0(e^-3 / 0!) + 3^1(e^-3 / 1!) + 3^2(e^-3 / 2!)

= 0.04998 + 0.14936 + 0.22404 = 0.42319

 


지수분포 (Exponential distribution)

 

포아송 분포에 의해 어떤 사건이 발생할 때, 어느 한 시점으로부터 이 사건이 발생할 때까지 걸리는 시간에 대한 확률 분포

 

확률밀도 함수

 

f(t) = λe^(-λt)

λ : 포아송 분포 평균

평균 : E(T) = 1 / λ

분산 : Var(T) = 1 / λ^2

 

ex) 어느 웹사이트에 시간당 접속자 수는 λ = 3인 포아송 분포를 따른다 한다. 지금부터 시작하여 첫번째 접속자가 30분 이내 올 확률은?

 

P[T ≤ 0.5] = 0.5(integral(λe^(-λt))0)dt = 0.5(integral(3e^(-3t))0)dt = 0.5([-e^(-3t)])0 = 1-e^(-1.5) = 1-0.2231 = 0.7769

+ Recent posts