728x90
728x90
728x90

np.select(condition_list, choice_list, default)

 

x = np.arange(10)

>>> condlist = [x<3, x>5]

>>> choicelist = [x, x**2]

>>> np.select(condlist, choicelist)

array([ 0, 1, 2, 0, 0, 0, 36, 49, 64, 81])

 

 

-condition_list에서 여러개  condition을 만족한다면 first encounter condition에 해당하는 choice를 적용함

-default는 어떠한 condition 도 만족하지 않는 경우 output value

 

ex)

condlist = [

(score_df['average'] >= 90),

(score_df['average'] < 90) & (score_df['average'] >= 80),

(score_df['average'] < 80) & (score_df['average'] >= 70)]

choicelist = ['A','B','C']

 

score_df['Grade'] = np.select(condlist, choicelist)

728x90
728x90

Basic sampling methodsForward/Rejection/Importance sampling이 있다.

 

Forward sampling:

-먼저 Bayesian Network가 있을 때

Ex)

도둑이 들 확률은 0.001, 지진이 일어날 확률은 0.002, (P(Buglary=T)=0.001, P(Earthquake=T)=0.002)

도둑이 들었고 지진이 일어났을 때 알람이 울릴 확률은 0.95, (P(Alarm=T|Buglary=T and Earthquake=T) = 0.95)

도둑이 들었고 지진이 일어나지 않았을 때 알람이 울릴 확률은 0.94

...

알람이 울렸을 때 John이 call할 확률은 0.90 (P(JohnCalls=T|Alarm=T) = 0.90)

알림이 울리지 않았을 때 John이 call할 확률은 0.05 (P(JohnCalls=T|Alarm=F) = 0.05)

마찬가지로 Mary가 call하는 확률도 앎

 

Foward sampling의 과정은

1. Generate a sample from the Bayesian network 

  -Follow topological order and create such sample many, many, many times

2. Count the samples match the case, (예를 들면 P(Earthquake=T|MaryCalls=T)을 알고 싶다면)

  -Buglary부터 MaryCalls까지 주어진 가정하의 확률로 sampling을 엄청많이 해서, MaryCalls가 T인 case내에 Earthquake가 T인 것들의 비율을 세서, 알고 싶은 P(E|MC)을 추정하는 방식이다.

 

단점은

Bayesian Network가 꽤 클 때, 계산량이 너무 많다.(Sampling을 무식하게 하다보니)

 

 

 

Rejection sampling:

Ex) 위의 예를 따라서

P(E=T|MC=T and A=F)을 알고자 하자.(목표설정)

 

Rejection sampling의 과정은 (Dicrete case)

1. Forward sampling하는 와중에 조건부확률의 조건(MC=T and A=F)에 맞지 않는다면 즉시 버리고 처음으로 돌아가서 sampling을 하는 것

Ex)

Buglary=F -> 문제 없음

Earthquake=T -> 문제 없음

Alarm = T -> 문제 있음(조건 A=F와 맞지 않음) -> 이후 JohnCalls와 MaryCalls에 대한 sampling하지 않고 다시 초기의 Buglary로 돌아감

2. Forward sampling과 마찬가지로 Count the samples match the case...

 

Rejection sampling의 과정은 (Continuous case)

1. 원하는 target distribution을 p(x)라 하자. (sampling하고 싶은 확률분포)

2. 다음 조건을 만족하는 보조 확률 분포(q(x))를 찾는다.(proposal distribution이라 한다.)

  - sampling이 이미 가능한 확률분포(Uniform or Normal 등)

  - 적당한 M값을 곱하여 p(x)를 envelope할 수 있는 확률분포, envelope한 다는 말은, 어느 x에서든 p(x)보다 Mq(x)가 큰

3. 다음 과정을 통해 sampling을 한다.

count = 0

while count < N:

  sampling x ~ q(x)

  sampling u ~ uniform(0,1)

  if u < p(x)/Mq(x):

    Accept x

    count += 1

  else:

    Reject and resampling

여기서 p(x)/Mq(x)을 이해하는 것이 중요하다. 

우리가 목표로하는 p(x)에 비해 "너무나 큰" Mq(x)라면 sampling하여 얻은 x를 그대로 취하기 보다는

"너무나 큰" 정도에 따라 "적절히" Accept하자는 것이다.

p(x)에 비해 너무나 큰 Mq(x)면 p(x)/Mq(x)가 매우 작을 것(Ex 0.01)이며

이에 따라 if u < p(x)/Mq(x)를 통과하기 힘들 것(0.01확률로 통과)

따라서, Mq(x)와 p(x) 사이의 영역이 Reject region이고 x축과 p(x)사이의 영역이 Accept region이 된다.

 

단점:

-Forward sampling보다는 sample의 개수가 적어도, 정확도는 높아 보이나, 어쨌든 reject region이 크면 그만큼 적당한 개수의 samples을 찾는데에 오래 걸릴 것이다.

-애초에 sampling할 p(x)와 유사한 q(x)를 잡지 않는 이상, sampling이 잘 안되서 현실에선 잘 사용하지 않음

 

 

 

Importance sampling:

-sampling을 해서 p(x)의 histogram을 그린다면, 이후 p(x)관련된 계산은 수월히 할 수 있지만, 원하는게 histrogram 전체가 아니라 특정 확률, 특정 기댓값을 원하는 상황이라면 그렇게 무식하게 histogram을 다 구하지 말고 그냥 원하는 것에만 집중하자는 컨셉이다. 따라서 "Use the wasted sample".

-E_(x~p)[X], P(X>3) 형태를 계산하는 것인데, 사실 확률은 기댓값으로 표현이 가능하기 때문에(Characteristic function) 대부분 자료들이 기댓값에 대해서 설명한다.

 

 

Importance sampling의 과정은 (Discrete case)

위와 마찬가지의 예제를 따라 P(Earthquake=T|MaryCalls=T and Alarm=F)=?

즉 구체적인 확률값을 근사하고자함 from sampling

 

SumSW = 0; NormSW= 0;

Iterate many:

  SW = sample weight = 1

  Generate a sample from the Bayesian network(즉 Buglary부터 MaryCalls까지 sampling)

  (만약 Buglary=F, Earthquake=F, Alarm=F라면 P(Alarm=F|Buglary=F and Earthquak=F)=0.999를 SW에 곱)

  (만약 MaryCalls=T라면 P(MaryCalls=T|Alarm=F)=0.01을 SW에 곱)

  (따라서 현재 SW는 1*0.999*0.01)

  If the sample has E=T(즉 관심대상), SumSW += SW

  NormSW += SW (E=T든 E=F든 항상)

 

이후 P(E=T|MC=T and Alarm=False) = SumSW/NormSW

여기서 SW를 구하는 데에 있어서 P(Buglary=F)와 P(Earthquak=F)는 고려하지 않아도 되는게, NormSW와 SumSW 모두에 포함될 term이므로 생략 가능

 

Importance sampling의 과정은 (Continuous case)

즉 E(f)를 구하는 데에 p에 대한 분포를 q에 대한 분포로 바꾸고 p(z)/q(z) term을 함께 고려하여 E(f)를 추정

여기서 p(z)/q(z)가 importance weight역할을 하기에 importance sampling이라 한다.

 

 

 

Sampling methods는 이제 몇개 알겠고, 목표는

Sampling based inference이며 Metropolis-Hastings Algorithm과 특정 케이스인 Gibbs sampling에 대해 알아보자.

이전 Forward/Rejection/Importance sampling에서는 이전에 나온 sample instance가 이후 sample instance에 영향을 미치지 않는 상황이었으나, 이전에 나온 sample

www.youtube.com/watch?v=pAWc8BCUHlo

728x90

'Math' 카테고리의 다른 글

(미완)Missing data를 어떻게 다룰 것인가  (0) 2020.10.26
[Statistics]Likelihood, MLE, MAP  (0) 2020.10.25
[Algorithm]Viterbi algorithm  (0) 2020.10.18
Proxy variable  (0) 2020.10.04
Multinomial Distribution  (0) 2020.10.04
728x90

주어진 것들이 다음과 같을 때:

-observation space (=O)

-observation sequence (=Y=(y_1, y_2, ..., y_T)

-state space (=S)

-initial state probability (=Π)

-transition matrix (=A)

-emission matrix (=B)

(transition matrix a_(i,j)는 state i에서 state j로 바뀔 확률(직전 시점에서 다음 시점의 state 전이 확률로, markov property를 전제하는 상황)

 

구하고자 하는 것:

The most likely state sequence X=(x_1, x_2, ..., x_T)

 

이상적이나 불가능한 상황:

t=1, 2, ..., T까지 모든 가능한 경로를 계산하고 argmax취하자.

->|S| = 13이고 T가 10이라면

가능한 경로의 개수가 13^10, 약 5x10^14,

경로별 계산량이 덧셈, 곱셈이 20회, 

총 필요한 계산량이 10^16회 정도,

초당 10^11회 계산 가능하다면 모든 경로를 계산하는데에 있어서 약 1.15 day가 소모

 

알고리즘의 핵심:

-initial, 첫 observation을 보고 가장 높은 확률을 갖는 (state, probability)를 찾는다.

-recursive, 직전(t-1)에 구한 (state, probability) 모든 case에 대해 observation(t)을 통해 현재(t)에 (state, probability)를 찾고 max값과 argmax(state)를 저장한다.

 

알고리즘의 결과:

-마지막 시점(T)에 argmax(state)을 얻고, 그때(T)에 사용한 T-1시점의 state을 얻고, 그때(T-1)에 사용한 T-2시점의 state을 얻고....

따라서 (x_1, x_2, ..., x_T)을 얻는다.

 

Complexity of this implementation:

O(Tx|S|^2), 즉 T에 대해서는 차수가 1인게 관건

(이상적이나 불가능한 상황은 O(|S|^T), 같은 |S|=13, T=10을 비교하면 1,690과 13^10)

 

참고자료:

-en.wikipedia.org/wiki/Viterbi_algorithm

 

Viterbi algorithm - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Algorithm for finding the most likely sequence of hidden states The Viterbi algorithm is a dynamic programming algorithm for finding the most likely sequence of hidden states—called

en.wikipedia.org

-post.naver.com/viewer/postView.nhn?volumeNo=17867939&memberNo=11190852

 

#3 비터비와 비터비 알고리즘

[BY Sejongbooks] 비터비 알고리즘은 현대 디지털 통신에서 가장 잘 사용하는 알고리즘이며 여러 자연어...

m.post.naver.com

-cs.kangwon.ac.kr/~leeck/NLP/06-2_viterbi.pdf

 

 

 

728x90

'Math' 카테고리의 다른 글

(미완)Missing data를 어떻게 다룰 것인가  (0) 2020.10.26
[Statistics]Likelihood, MLE, MAP  (0) 2020.10.25
(미완)[Parameter Inference]Sampling based inference  (0) 2020.10.18
Proxy variable  (0) 2020.10.04
Multinomial Distribution  (0) 2020.10.04
728x90

문제:www.acmicpc.net/problem/14888

 

비고:

-Brute force

-next permutation만 있으면 해결됨

-난이도중

 

728x90

'CS' 카테고리의 다른 글

[Numpy] np.vectorize는 사용하지 말자.  (0) 2020.10.20
[Numpy]np.select  (0) 2020.10.19
[Algorithm]백준, 10819, 차이를 최대로  (0) 2020.10.16
[Algorithm]백준, 1920, 수 찾기  (0) 2020.10.16
[Algorithm]백준, 1912, 연속합  (0) 2020.10.14
728x90

문제:www.acmicpc.net/problem/10819

 

비고:

-Brute force

-다 세지 않고선 규칙을 발견하기 힘들며, 영역 나누기도 힘들어 보이며, 주어진 조건이 가용 시간/메모리 내에 해결 가능

-이런 문제에서 모든 경우를 세기 위해서 next permutation함수를 잘 짜야 한다.

-입력받은 list을 next permutation으로 바꾸며, return은 True/False로 작성

-next permutation을 처음작성하는 거라면 난이도가 있다.

  -기본 규칙은, 배열의 index 0부터(=좌측부터) 우측으로 훑으며 "마지막" 증가(increase)인 index(i)를 찾는다.

  ex) 124653에서 46가 마지막 증가(<)고 4의 index인 2

  -마지막 증가에서의 값보다 크며 가장 우측에 존재하는 값의 index(j)를 찾는다.

  ex) 124653에서 65중에서 5가 더 오른쪽, 5의 index인 4

  -i,j에서의 값 교환

  ex) 124653 -> 125643

  -j보다 우측의 값들을 정렬시킨다.

-난이도중

 

내소스코드:

boj.kr/33b0cb84fe5d4b48b02c860081023606

 

728x90

'CS' 카테고리의 다른 글

[Numpy]np.select  (0) 2020.10.19
[Algorithm]백준, 14888, 연산자 끼워넣기  (0) 2020.10.16
[Algorithm]백준, 1920, 수 찾기  (0) 2020.10.16
[Algorithm]백준, 1912, 연속합  (0) 2020.10.14
[Algorithm]백준, 2630, 색종이 만들기  (0) 2020.10.12
728x90

문제:www.acmicpc.net/problem/1920

 

비고:

-Binary search

-문제를 딱보고, 찾아야하는 수를 region에 for문 돌리는 상황생각하면, region 전체를 훑는게 비효율적임을 느껴야한다.

-실무에서도 그냥 search가 자주 일어난다면, 기존 region을 정렬해둬야 함을 알아차려야한다.

-그리고 찾아야하는 것과 region 사이에 대소비교를 할 key field가 필요해야함을 알아야 한다.

-재귀함수를 작성함에 있어서, (성공, 불가능, 오답, 계속) 형태로 작성하자. 즉, 종료하는 케이스가 일찍이 나오게 해줘야 무한 루프에 빠지지 않을 가능성을 높여준다. 

-난이도하

 

내소스코드:

boj.kr/9016f079aa1344f59b645ee752dc460c

 

공유 소스 보기

 

www.acmicpc.net

 

728x90
728x90

문제:www.acmicpc.net/problem/1912

 

비고:

-Dynamic programming

-예제2에서 문제 포인트를 알아차려야했는데 놓쳤다.

2 1 -4 3 4 -4 6 5 -5 1 에서 6 5->11이 답이라고 착각하였다. 답은 3 4 -4 6 5로 14다.

-여기서부터 문제를 파악하고 해결해 나가자.

-각 index마다 left max값과 right max값 그리고 index에서의 값을 다 더하고 취합하고 취합한 것에서 max를 구하면 된다.

-각 점마다 left max를 dictionary로 박자. 이 때, index가 작은 순부터 left max를 구하는 것에서 dynamic programming

-0에서는 left max가 0, 1에서는 left max가 0에서의 leftmax + 0에서의 값, 이 때 이 더한 값이 음수면 1에서의 leftmax는 0, 양수면 그 값을 1에서의 left max로 택한다.

-이러면 n번의 계산으로 모든 점에서의 left max를 구한다.

-마찬가지로 n번의 계산으로 모든 점에서의 right max를 구한다.

-문제파악에서 차질이 생겼다. 다음에는 반드시 예제의 정답을 믿자. 예제가 틀렸다고 생각하다니...ㅉㅉ

-게다가 사람들이 많이 푼 문제에 오류가 있다고 생각하면 되겠냐

-난이도중

 

내소스코드:

boj.kr/12104c7b668241f7b7ef8ee4d6ab8541

 

공유 소스 보기

 

www.acmicpc.net

 

728x90
728x90

문제:www.acmicpc.net/problem/2630

 

비고:

-Divide and conquer(분할-정복-조합)

-checker, divider, solve를 정의하여 사용, 최종적인 result인 dictionary를 유지

-난이도하

 

내소스코드:

boj.kr/39dad1f4b4aa4923a86f5f3f9d298ff4

 

공유 소스 보기

 

www.acmicpc.net

 

728x90
728x90

문제:www.acmicpc.net/problem/1707

 

비고:

-dfs로 돌면서 label(dictionary)를 잡고 돌고

-이웃node가 label이 없으면 이전 nodes' label과 반대로 달고

-새로운 node마다 labeled 이웃 전체(이전 node를 지우고하는게 아니라)에 대해 label이 같은지 테스트가 관건

-난이도 중

 

내소스코드:

boj.kr/79b09fa7f4294aa19104a5d58d317c05

 

공유 소스 보기

import itertools import sys sys.setrecursionlimit(99999) test_case = int(sys.stdin.readline().strip()[0]) data = (list(map(int, x.strip().split())) for x in sys.stdin.readlines()) def trans(x): return -x def dfs(x, adj_, chk_, label_, prev_, res): chk_[x]

www.acmicpc.net

 

728x90
728x90

문제:https://www.acmicpc.net/problem/1931

 

비고:

-Greedy algorithm 활용(Optimal substructure, Greedy choice property)

-list.sort(key=lambda x: (x[1],x[0])) 형태로 주면, multiple fields에 대해 우선순위 줘가며 sorting이 가능

-다음 케이스를 놓쳐서 오래 걸림

5

4 4

4 4

3 4 

2 4 

1 4

정답은 3

-즉 포인트는 같은 종료 시간 내에 시작 시간을 정렬해야 한다는 점과 그 때 단순히 이어진 시작 시간 2개 교체해나가는 바람에 100%에서도 틀렸습니다를 얻게됨

-생각보다 오래걸림 ㅠㅠ

-난이도가 중

 

내소스코드:

boj.kr/d38992bbf196403e87c8619016a051c2

 

공유 소스 보기

 

www.acmicpc.net

 

728x90

+ Recent posts