PyMC에서 두 개의 정규 분포에 대한 적합 모형


10

나는 시작하기 전에 더 많은 통계를 배우려고 노력하는 소프트웨어 엔지니어이기 때문에, 이것은 새로운 영역입니다.

PyMC를 배우고 실제로 (실제로) 간단한 예제를 통해 작업했습니다. 내가 일할 수없는 한 가지 문제 (및 관련 예제를 찾을 수 없음)는 두 정규 분포에서 생성 된 데이터에 모델을 피팅하는 것입니다.

1000 개의 값이 있다고 가정합니다. a에서 생성 된 500 Normal(mean=100, stddev=20)과 a에서 생성 된 다른 500 Normal(mean=200, stddev=20).

모델을 적합하게하려면 PyMC를 사용하여 두 평균과 단일 표준 편차를 결정하십시오. 나는 그것이 라인을 따라 무언가라는 것을 알고있다 ...

mean1 = Uniform('mean1', lower=0.0, upper=200.0)
mean2 = Uniform('mean2', lower=0.0, upper=200.0)
precision = Gamma('precision', alpha=0.1, beta=0.1)

data = read_data_from_file_or_whatever()

@deterministic(plot=False)
def mean(m1=mean1, m2=mean2):
    # but what goes here?

process = Normal('process', mu=mean, tau=precision, value=data, observed=True)

즉, 생성 프로세스는 정상이지만 mu는 두 값 중 하나입니다. 나는 값이에서 오는지 m1또는 에서 오는지 "결정"을 나타내는 방법을 모른다 m2.

아마도 나는 이것을 모델링하는 데 완전히 잘못된 접근법을 취하고 있습니까? 누구든지 예를들 수 있습니까? 버그와 JAGS를 읽을 수 있으므로 실제로는 아무 문제가 없습니다.

답변:


11

절반은 한 배포에서, 다른 절반은 다른 배포에서 온 것이 확실합니까? 그렇지 않다면, 우리는 비율을 랜덤 변수로 모델링 할 수 있습니다 (이것은 매우 베이지안입니다).

다음은 내가 할 일이며 일부 팁이 포함되어 있습니다.

from pymc import *

size = 10
p = Uniform( "p", 0 , 1) #this is the fraction that come from mean1 vs mean2

ber = Bernoulli( "ber", p = p, size = size) # produces 1 with proportion p.

precision = Gamma('precision', alpha=0.1, beta=0.1)

mean1 = Normal( "mean1", 0, 0.001 ) #better to use normals versus Uniforms (unless you are certain the value is  truncated at 0 and 200 
mean2 = Normal( "mean2", 0, 0.001 )

@deterministic
def mean( ber = ber, mean1 = mean1, mean2 = mean2):
    return ber*mean1 + (1-ber)*mean2


#generate some artificial data   
v = np.random.randint( 0, 2, size)
data = v*(10+ np.random.randn(size) ) + (1-v)*(-10 + np.random.randn(size ) )


obs = Normal( "obs", mean, precision, value = data, observed = True)

model = Model( {"p":p, "precision": precision, "mean1": mean1, "mean2":mean2, "obs":obs} )

2
뻔뻔한 홍보 : 난 그냥 베이 즈 및 pyMC에 대한 블로그 기사를 쓴 문자 그대로 내가 그것을 확인하기 위해 당신을 초대 있도록,이 게시하기 전에 일분. 베이 즈의 최고 파워 - 제 1 부
Cam.Davidson.Pilon

대박! 이 두 가지 방법의 혼합에 대한이 접근법은 정확히 내가 머리를 get려고하는 것입니다.
매트 kelcey

mean1과 mean2가 Uniform 대신에 일반적으로 분포된다는 말의 진정한 모델링 이점을 완전히 이해하지 못합니다 (정확하게 정직하기 위해 동일하게 진행됩니다. "누군가"이후로 감마를 사용하고 있습니다). 나는 :) 많이 배워야있어
매트 kelcey

원래 예에서와 같이 유니폼을 사용한다는 것은 평균이 어떤 값을 초과하지 않는다는 것을 확실하게 알고 있음을 의미합니다. 이것은 다소 병리학 적입니다. 모든 실수를 고려할 수 있으므로 법선을 사용하는 것이 좋습니다.
Cam.Davidson.Pilon

1
감마의 선택에는 수학적인 이유가 있습니다. 감마는 인 공액 전에 테이블을 참조 정밀도 여기
Cam.Davidson.Pilon

6

위의 논의와 관련된 몇 가지 사항 :

  1. 확산 법선 대 유니폼 선택은 (a) 컨쥬 게이션이 걱정되는 경우를 제외하고는 꽤 학문적입니다. . PyMC를 사용하면 특별히 Gibbs 샘플러를 사용하지 않는 한 접합에 대해 걱정할 이유가 없습니다.

  2. 감마는 실제로 분산 / 정밀도 매개 변수 이전의 정보가없는 경우에 적합하지 않습니다. 더 유익하게 생각할 수 있습니다. 더 나은 선택은 표준 편차보다 균일 한 우선 순위를두고 역 제곱으로 변환하는 것입니다. 자세한 내용은 Gelman 2006 을 참조하십시오.


1
아 폰 네벡은 pymc의 핵심 개발자 중 하나입니다! 포인트 2를 코딩하는 방법의 예를 보여 주시겠습니까?
Cam.Davidson.Pilon

고마워 fonnesbeck 그리고 네 제발! 포인트 2의 빠른 예) :)
매트 kelcey

1
사실 나는 당신이 ... gist.github.com/4404631 의 라인을 따라 무언가를 의미한다고 생각합니다 .
매트 kelcey

예, 정확히 좀 더 간결하게 변환을 수행 할 수 있습니다.tau = std_dev**-2
fonnesbeck

precision과 std_dev의 관계가 어디에서 나오는지에 대한 올바른 장소는 무엇입니까?
user979
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.