2017-09-12 13 views
1

Mixture에서 PyMC3을 사용하여 두 개의 베타 배포본을 혼합하여 데이터를 저장하려고합니다. 각 배포본의 가중치를 알지 못합니다. 여기에 코드입니다 :PyMC3의 Beta 배포판을 올바르게 정의하는 방법

model=pm.Model() 
with model: 
    alpha1=pm.Uniform("alpha1",lower=0,upper=20) 
    beta1=pm.Uniform("beta1",lower=0,upper=20) 
    alpha2=pm.Uniform("alpha2",lower=0,upper=20) 
    beta2=pm.Uniform("beta2",lower=0,upper=20) 
    w=pm.Uniform("w",lower=0,upper=1) 
    b1=pm.Beta("B1",alpha=alpha1,beta=beta1) 
    b2=pm.Beta("B2",alpha=alpha2,beta=beta2) 
    mix=pm.Mixture("mix",w=[1.0,w],comp_dists=[b1,b2]) 

실행 나는 다음과 같은 오류가이 코드 후 : AttributeError: 'list' object has no attribute 'mean'. 어떤 제안?

답변

1

PyMC3에는 유용한 예제가 들어있는 pymc3.tests 모듈이 함께 제공됩니다. 단어에 대한 디렉토리를 검색하여 "혼합물"나는 this example에 온 다음 classmethod dist를 호출 할 때

Mixture('x_obs', w, 
     [Normal.dist(mu[0], tau=tau[0]), Normal.dist(mu[1], tau=tau[1])], 
     observed=self.norm_x) 

공지 사항. "pymc3의 DIST의 classmethod를"인터넷 검색을하면 제거 다운 분포가 여기에 필요한 사항을 왜 내가 완전히 명확하지 않다이 외에도

... each Distribution has a dist class method that returns a stripped-down distribution object that can be used outside of a PyMC model.

설명이 doc page에 이르게하지만 작동하는 것 같다 :

import pymc3 as pm 

model = pm.Model() 
with model: 
    alpha1 = pm.Uniform("alpha1", lower=0, upper=20) 
    beta1 = pm.Uniform("beta1", lower=0, upper=20) 
    alpha2 = pm.Uniform("alpha2", lower=0, upper=20) 
    beta2 = pm.Uniform("beta2", lower=0, upper=20) 
    w = pm.Uniform("w", lower=0, upper=1) 
    b1 = pm.Beta.dist(alpha=alpha1, beta=beta1) 
    b2 = pm.Beta.dist(alpha=alpha2, beta=beta2) 
    mix = pm.Mixture("mix", w=[1.0, w], comp_dists=[b1, b2]) 

dist 클래스 메서드를 사용할 때 이름 문자열이 생략됩니다.