베이즈 확률론(Bayesian probability) by 바죠

베이즈 확률론(Bayesian probability)

베이즈 확률론(Bayesian probability)은 확률을 '지식 또는 믿음의 정도를 나타내는 양'으로 해석하는 확률론이다.
확률을 발생 빈도(frequency)나 어떤 시스템의 물리적 속성으로 여기는 것과는 다른 해석이다. 
이 분야의 선구자인 18세기 통계학자 토머스 베이즈(T. Bayes)의 이름을 따서 명명되었다.
어떤 가설의 확률을 평가하기 위해서 사전 확률을 먼저 밝히고 새로운 관련 데이터에 의한 새로운 확률값을 변경한다.
데이터가 주어지기 전에 이미 어느 정도 확률값을 예측하고 있을 때 이를 새로 수집한 데이터와 합쳐서 최종 결과에 반영할 수 있다.

베이즈 확률론은 통계학에서 아주 중요한 항목임에 틀림이 없다. 
베이즈 확률론은 그것에 머물러 있지 않다. 오늘날, 다시 한 번 중요한 개념으로 리바어벌 되고 있다. 
데이터가 많을 수록 더 정교한 예측이 가능하다.
인공지능 분야에서 아주 잘 활용할 수 있는 통계학 이론이다. 

cf.

사전 확률 (a priori)
가능도(우도, likelihood)
사후 확률 (a posteriori)

이미 가지고 있는 지식을 통해 부여한 확률을 사전확률(a priori probability) 이라고 한다. 
실험 후에 어떤 원인으로부터 일어난 것, 추가된 정보로부터 사전확률을 새롭게 수정한 확률을 사후확률(a posteriori probability) 라고 한다.
사후확률(a posteriori probability)이 가설  H 에 대한 함수인 반면에, 가능도 함수(likelihood function) 은 관측 데이터 D 에 대한 함수이다.

무척 어려운 이야기이다. 
거짓말 하나 안하고 이야기했을 때, 이것을 제대로 이해하는데 몇 년이 걸릴 수도 있다. 10년도 충분히 가능하다. 
통계학에서 나온 것인데, 물리학을 전공한 입장에서 쉽게 이야기하면, 이것은 진짜 양자역학만큼 어려운 것이다. 
그런데, 10년안에 양자역학을 이해할 수 있기는 한가?

결국, 위상 불변량(topological invariant)을 이해하기 위해서 오일러 지수(Euler characteristic)를 언급했듯이 이번에도 마찬가지로 정다면체에서 시작한다. 
베이즈 확률론을 이해하기 위한 또 하나의 시도를 해 본다. 결코 만만치 않다. 
이번에는 한 단계 나아갈 수 있기를 기대한다.
역시 눈에 보여야 이해가 간다고 볼 수 있다. 

정다면체(regular polyhedron)로 만들어진 주사위가 5개 있다. 
(정다면체는 5가지 밖에 없다.) http://incredible.egloos.com/1411123
정다면체 주사위를 만들 수 있다. 
4면체에는 1, 2, 3, 4를 각 면에다 적는다.
6면체에는 1, 2, 3, 4, 5, 6을 각 면에다 적는다.
8, 12, 20면체에도 마찬가지로 적는다. [신라 유물, 안압지에서 나온 주사위는 14면체라고 한다. 술 마실 때 사용한 것(주령구)이라고 한다. 정다면체가 아니기 때문에 확률이 균등하지 않다.]


아주 이해가 쉽게 된다.
그 다음에 아래와 같은 질문을 한다. 이 질문으로 부터 각자 베이즈 확률론을 이해하시길 바란다. 
그 어떠한 자세한 설명도 독자들을 괴롭힐 뿐이다. 스스로 깨우쳐야 제대로 이해할 수 있다.

4면체, 6면체, 8면체, 12면체, 그리고 20면체 주사위가 든 상자가 있다. 
상자에서 임의로 주사위 하나를 집어서 던졌더니 "12"가 나왔습니다. 
그렇다면 각각의 주사위를 선택했었을 확률은?


------------------------------------------------------------------------------------------------------------------------

tetrahedronhexahedronoctahedrondodecahedronicosahedron
a priori P(H)1/51/51/51/51/5
likelihood P(D|H)0001/121/20
a priori × likelihood0001/601/100
a posteriori P(H|D)0005/83/8

------------------------------------------------------------------------------------------------------------------------

1/60 + 1/100 = (10+6)/600 = 16/600 

600/16 * 1/60 = 10/16 = 5/8

600/16 * 1/100 = 6/16 = 3/8

------------------------------------------------------------------------------------------------------------------------
P.S.

피자헛디리버리 = Ph.D. = PHD = ....

박사는 가설과 데이터를 창출했을 때 확률적으로 가능하다.

P : 확률

H : 가설

D : 데이터


 Philosophiæ Doctor, Doctor of Philosophy, Ph.D., PhD

------------------------------------------------------------------------------------------------------------------------

쇼핑족 : 아이 쇼핑족 = 0.2 : 0.8
쇼핑족이 점원에게 질문을 할 확률은 0.9, 질문을 하지 않을 확률은 0.1,
아이 쇼핑족의 경우 해당 확률들이 각각 0.3, 0.7이라고 하자.

한 손님이 말을 걸었다고 하자.

0.2 x 0.9 = 0.18
0.8 x 0.3 = 0.24

일어지 않은 가능성의 세계를 제거할 수 있게 된다.
일어닌 가능성의 세계를 정규화 시킨다.

쇼핑족일 사전확률 0.2이다. 관측이 없는 상태에서 얻어낼 수 있는 확률이다.
 
말을 거는 것을 관측한 후
쇼핑족의 사후 확률은 3/7 이 된다.
0.18 : 0.24 = 3 : 4 = 3/7 : 4/7

사전확률을 행동의 관측, 또는 정보취득 후, 사후확률로 갱신되는 것--> 베이즈 추정이라고 한다.
베이즈 갱신 과정을 설명한 것이다.

------------------------------------------------------------------------------------------------------------------------

1000명 중 1명이 암에 걸려 있다.

암 환자가 양성 진단을 받은 확률 0.95, 음성 진단 확률 0.05
건강한 사람이 양성일 확률 0.02, 음성일 확률 0.98

검사후 양성일 때, 암에 걸리 확률?
검사 결과가 양성이므로 일어날 가능성이 없는 것들을 모두 제거한다.

0.001 x 0.95 = 0.095 
0.999 x 0.02 = 1.998

0.095/(0.095+1.998) : 1.998/(0.095+1.988)  = 0.0454 : 0.9546

따라서, 양성 검사를 받았을 때, 암에 걸리 확률은 4.54 % 정도이다.

------------------------------------------------------------------------------------------------------------------------

발렌타인 데이에 여자로 부터 초콜릿을 선물받은 남자가 고민한다.
진심으로 초코릿를 준걸까? 아니면 의례적으로 준걸까?

이유불충분으로 5: 5로 우선 생각한다.

입수한 정보: 직장 여성이 초콜릿을 줄 확률을 조사해 보았다.
진심으로 줄 확률 0.4, 안 줄 확률 0.6
논외인데 줄 확률 0.2, 안 줄 확률 0.8

0.4 x 0.5  = 0.2
0.2 x 0.5  = 0.1

0.2 : 0.1 = 2/3 : 1/3

이 남자가 여자의 진심일 확률은 2/3가 된다.

------------------------------------------------------------------------------------------------------------------------

베이즈 추정에는 축차합리성이 있다.

첫번째 정보와 두번째 정보를 동시에 고려하는 것 == 첫번째 정보를 고려하여 사후확률을 계산한 후, 이를 두번째 정보에 대한 사전확률로 사용하는 것 == 학습이 진행된다고 볼 수 있다.

인공지능 분야에서 왜 베이즈 확률론을 받들어 모시는지 자명해진다.
베이즈 갱신이 바로 사전확률-->사후확률로의 전환을 의미하며, 지속적인 데이터 업데이트는 지속적인 학습을 의미한다.
축차합리성에 의해서 지속적인 베이즈 갱신은 가능하다.
이것이 바로 학습에 해당한다.
진화학습에서는 교차와 변이를 통해서 학습에 도달한다.


https://www.youtube.com/watch?v=HZGCoVF3YvM


------------------------------------------------------------------------------------------------------------------------

베이즈 추정에는 축차합리성이 있다.

첫번째 정보와 두번째 정보를 동시에 고려하는 것 == 첫번째 정보를 고려하여 사후확률을 계산한 후, 이를 두번째 정보에 대한 사전확률로 사용하는 것 == 학습이 진행된다고 볼 수 있다.


# example of bayesian optimization for a 1d function from scratch
from math import sin
from math import pi
from numpy import arange
from numpy import vstack
from numpy import argmax
from numpy import asarray
from numpy.random import normal
from numpy.random import random
from scipy.stats import norm
from sklearn.gaussian_process import GaussianProcessRegressor
from warnings import catch_warnings
from warnings import simplefilter
from matplotlib import pyplot

# objective function
def objective(x, noise=0.1):
    noise = normal(loc=0, scale=noise)
    return (x**2 * sin(5 * pi * x)**6.0) + noise

# surrogate or approximation for the objective function
def surrogate(model, X):
    # catch any warning generated when making a prediction
    with catch_warnings():
        # ignore generated warnings
        simplefilter("ignore")
        return model.predict(X, return_std=True)

# probability of improvement acquisition function
def acquisition(X, Xsamples, model):
    # calculate the best surrogate score found so far
    yhat, _ = surrogate(model, X)
    best = max(yhat)
    # calculate mean and stdev via surrogate function
    mu, std = surrogate(model, Xsamples)
    mu = mu[:, 0]
    # calculate the probability of improvement
    probs = norm.cdf((mu - best) / (std+1E-9))
    return probs

# optimize the acquisition function
def opt_acquisition(X, y, model):
    # random search, generate random samples
    Xsamples = random(100)
    Xsamples = Xsamples.reshape(len(Xsamples), 1)
    # calculate the acquisition function for each sample
    scores = acquisition(X, Xsamples, model)
    # locate the index of the largest scores
    ix = argmax(scores)
    return Xsamples[ix, 0]

# plot real observations vs surrogate function
def plot(X, y, model):
    # scatter plot of inputs and real objective function
    pyplot.scatter(X, y)
    # line plot of surrogate function across domain
    Xsamples = asarray(arange(0, 1, 0.001))
    Xsamples = Xsamples.reshape(len(Xsamples), 1)
    ysamples, _ = surrogate(model, Xsamples)
    pyplot.plot(Xsamples, ysamples)
    # show the plot
    pyplot.show()

# sample the domain sparsely with noise
X = random(100)
y = asarray([objective(x) for x in X])
# reshape into rows and cols
X = X.reshape(len(X), 1)
y = y.reshape(len(y), 1)
# define the model
model = GaussianProcessRegressor()
# fit the model
model.fit(X, y)
# plot before hand
plot(X, y, model)
# perform the optimization process
for i in range(100):
    # select the next point to sample
    x = opt_acquisition(X, y, model)
    # sample the point
    actual = objective(x)
    # summarize the finding
    est, _ = surrogate(model, [[x]])
    print('>x=%.3f, f()=%3f, actual=%.3f' % (x, est, actual))
    # add the data to the dataset
    X = vstack((X, [[x]]))
    y = vstack((y, [[actual]]))
    # update the model
    model.fit(X, y)

# plot all samples and the final surrogate function
plot(X, y, model)
# best result
ix = argmax(y)
print('Best Result: x=%.3f, y=%.3f' % (X[ix], y[ix]))



핑백

덧글

  • 지나다 2020/12/31 18:46 # 삭제 답글

    님 덕분에 확실히 이해했네요. 감사. priori는 사건이 없어도 알수 있는 확률이니까 각 주사위를 집을 확률이군요. likelihood는 집은 면이 12가 되는 사건이 일어날 가능성이니까 12면체이면 1/12이겠구요. 5개 중 하나를 집었을때 12가 나오는 사건이 일어났을 때, 그 확률이 posteriori 군요. 용어와는 별개로 이 사건이 일어날 (전체 확률)은 1/5 * 1/12 + 1/5 * 1/20 = 16/600입니다. (12면체를 집어서 12가 나올 확률)과 (20면체를 집어서 12가 나올 확률)이 전부죠. 12가 나온 후에 그것이 12면체일 확률은 (전체 확률 ) x (12면체를 집어서 12가 나올 확률) = 16/600 * 1/60이 되겠네요. 다시 용어를 생각해 보면 posteriori는 사건이 벌어지고 난 후 그 사건이 벌어질 확률이 되는 군요.
  • 지나다2 2021/01/19 19:08 # 삭제 답글

    안녕하세요. 유용한 정보가 많이 있군요. 제가 생각 중인 사업에 큰 도움이 될 것 같습니다. 사업에 성공하면 꼭 찾아 뵙겠습니다.
    혹시 사업에 관심이 있으시면 연락주세요. 비밀덧글로 연락처 남겼습니다. ^^
  • 바죠 2021/02/23 11:27 # 답글

    https://www.asiae.co.kr/article/2020031311435690422



    마케팅 이론, 게임 이론, 인공지능 이론, 의사결정 이론 등 베이즈 통계학의 응용 분야는 점점 더 확장되고 있다.

  • 바죠 2021/02/24 20:26 # 답글

    # architecture of CNN
    def buildModel(neurons,drop,nb_batch,hidden_layers):

    nb_epoch=100

    neurons=int(neurons)
    hidden_layers=int(hidden_layers)

    # input layer
    inputs = Input(shape=x_train.shape[1:])

    x = Conv2D(neurons, (3, 3), padding='same', activation='relu')(inputs)
    x = MaxPooling2D((2, 2), padding='same')(x)

    # hidden layers
    if hidden_layers !=0:
    for i in range(1,hidden_layers+1):
    x = Conv2D(neurons*(2**i), (3, 3), padding='same', activation='relu')(x)
    x = MaxPooling2D((2, 2), padding='same')(x)

    x = Flatten()(x)
    x = Dense(neurons*(2**(hidden_layers+1)), activation='relu')(x)
    x = Dropout(drop)(x)

    # output
    predictions = Dense(nb_classes, activation='softmax')(x)

    # modeling
    model = Model(inputs=inputs, outputs=predictions)

    model.compile(optimizer='rmsprop',
    loss='binary_crossentropy',
    metrics=['accuracy'])

    early_stopping = EarlyStopping(patience=10, verbose=1)

    # learning
    hist = model.fit(x_train, y_train, validation_split=0.2, epochs=int(nb_epoch), batch_size=int(nb_batch),callbacks=[early_stopping])

    # evaluate the model with test data
    score = model.evaluate(x_test, y_test)

    print("loss : ",score[0])
    print("accuracy : ",score[1])

    acc.append(score[1])

    return score[0]*(-1)
    # baeysian optimization
    def bayesOpt():
    pbounds = {
    # define the range of each parameter
    'drop' : (0,0.9),
    "neurons" : (2,50),
    'nb_batch' : (4,100),
    'hidden_layers' : (0,6)
    }
    optimizer = BayesianOptimization(f=buildModel, pbounds=pbounds)

    #init_points: number of initial points
    #n_iter: number of iteration
    #acq:acquire function, ucb as default
    optimizer.maximize(init_points=10, n_iter=30, acq='ucb')
    return optimizer

    # run bayesian optimization
    acc =[]
    result = bayesOpt()
    result.res
    result.max
  • 바죠 2021/05/19 09:11 # 삭제 답글

    https://www.youtube.com/watch?v=_SC5_2vkgbA&t=1099s
댓글 입력 영역

최근 포토로그



MathJax