MCMC 샘플의 모드 신뢰성


12

John Kruschke는 그의 저서 인 Doing Bayesian Data Analysis에서 R의 JAGS를 사용할 때

... MCMC 샘플의 모드 추정값은 MCMC 샘플의 랜덤 범프와 리플에 민감 할 수있는 평활 알고리즘을 기반으로하기 때문에 다소 불안정 할 수 있습니다. ( 205 페이지 베이 즈 데이터 분석 수행 , 섹션 8.2.5.1)

Metropolis 알고리즘과 Gibbs 샘플링과 같은 정확한 형식에 대해 알고 있지만 평론 알고리즘에 익숙하지 않으며 MCMC 샘플의 모드 추정이 불안정하다는 이유도 있습니다. 누구나 평활 알고리즘이 수행하는 작업과 왜 모드 추정이 불안정한 지에 대한 직관적 인 통찰력을 제공 할 수 있습니까?


2
John Kruschke는 커널 밀도 추정에 기반한 모드 추정 알고리즘에 대해 이야기합니다.
Andrey Kolyadin

2
링크 가 도움 이 될 수 있습니다.
Andrey Kolyadin

이 통계 영역에 익숙하지 않은 경우가 아니라면 JAGS는 확률 밀도 함수가 아닌 후방 분포에서 샘플 세트를 출력하므로 커널 밀도 추정이 확실하지 않습니다. 그래도 링크 주셔서 감사합니다.
Morgan Ball

나는 이것이 특정 값 중 하나 이상이 없을 수있는 연속 변수의 큰 샘플에서 모드를 얻는 방법과 더 관련이 있다고 생각하므로 샘플을 그룹화 (또는 매끄럽게)해야합니다.
Morgan Ball

1
커널 밀도 추정에서 최대 밀도의 값으로 모드를 얻을 수 있습니다. (적어도 이것은 내가 무엇이며, 내가 잘못 아니에요 경우 J. Kruschke는 자신의 예에서와 같은 방법을 사용)
안드레이 Kolyadin

답변:


8

나는이 책을 가지고 있지 않으므로 Kruschke가 사용하는 스무딩 방법을 잘 모르겠지만 직관을 위해 0.1에서 1.0까지의 다양한 대역폭을 사용 하는 가우스 커널 밀도 추정치 와 함께 표준 법선의 100 샘플 샘플을 고려하십시오 . (Breefly, Gaussian KDE는 일종의 스무딩 된 히스토그램입니다. 각 데이터 포인트에 대해 가우스를 추가하여 평균값을 관찰하여 밀도를 추정합니다.)

평활화가 단항 분포를 생성하더라도 모드는 일반적으로 알려진 값인 0보다 낮습니다.

여기에 이미지 설명을 입력하십시오

또한, 동일한 샘플을 사용하여 밀도를 추정하는 데 사용되는 커널 대역폭에 의한 추정 모드 (y 축)의 도표가 있습니다. 이것이 평활 모수에 따라 추정값이 어떻게 변하는 지에 대한 직관을 제공하기를 바랍니다.

여기에 이미지 설명을 입력하십시오

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Feb  1 09:35:51 2017

@author: seaneaster
"""

import numpy as np
from matplotlib import pylab as plt
from sklearn.neighbors import KernelDensity

REAL_MODE = 0
np.random.seed(123)

def estimate_mode(X, bandwidth = 0.75):
    kde = KernelDensity(kernel = 'gaussian', bandwidth = bandwidth).fit(X)
    u = np.linspace(-3,3,num=1000)[:, np.newaxis]
    log_density = kde.score_samples(u)
    return u[np.argmax(log_density)]

X = np.random.normal(REAL_MODE, size = 100)[:, np.newaxis] # keeping to standard normal

bandwidths = np.linspace(0.1, 1., num = 8)

plt.figure(0)
plt.hist(X, bins = 100, normed = True, alpha = 0.25)

for bandwidth in bandwidths:
    kde = KernelDensity(kernel = 'gaussian', bandwidth = bandwidth).fit(X)
    u = np.linspace(-3,3,num=1000)[:, np.newaxis]
    log_density = kde.score_samples(u)
    plt.plot(u, np.exp(log_density))

bandwidths = np.linspace(0.1, 3., num = 100)
modes = [estimate_mode(X, bandwidth) for bandwidth in bandwidths]
plt.figure(1)
plt.plot(bandwidths, np.array(modes))

5

Sean Easter는 좋은 답변을 제공했습니다. 다음은 Kruschke의 책과 함께 제공되는 R 스크립트에 의해 실제로 수행되는 방법입니다. 이 plotPost()함수는라는 R 스크립트에 정의되어 DBDA2E-utilities.R있습니다. 예상 모드를 표시합니다. 함수 정의 안에는 다음 두 줄이 있습니다.

mcmcDensity = density(paramSampleVec)
mo = mcmcDensity$x[which.max(mcmcDensity$y)]

density()함수는 R의 기본 통계 패키지와 함께 제공되며 Sean Easter와 같은 종류의 커널 밀도 필터를 구현합니다. 평활 커널의 대역폭과 사용할 커널 유형에 대한 선택적 인수가 있습니다. 기본적으로 가우시안 커널이며 좋은 대역폭을 찾는 데 몇 가지 내부 마법이 있습니다. 이 density()함수는 y다양한 값에서 평활 밀도를 갖는 구성 요소가 명명 된 객체를 반환 합니다 x. 위의 두 번째 코드 줄 은 최대 x값 인 값을 찾습니다 y.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.