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.