2014-10-23 3 views
2

파이썬 용 PyMC 라이브러리를 사용하여 베이지안 PCA를 구현하려고합니다. I 낮은 차원 좌표를 정의하지만 여기서, I는PyMC를 사용하는 베이지안 pca

모델

X = WZ + 전자는 ... 붙어

X는, W는 변환 행렬을 관측 벡터이다

및 z 낮은 차원의 좌표 벡터입니다.

우선 내가 Z에 대한 분포를 정의 할 수, 각 열은 정규 분포로부터 인출되는 변환 행렬 W. (간략화를 위해 제로 평균 및 ID 공분산)

def W_logp(value): 
    logLikes = np.array([multivariate_normal.logpdf(value[:,i], mean=np.zeros(dimX), cov=1) for i in range(0, dimZ)]) 
    return logLikes.sum() 

def W_random(): 
    W = np.zeros([dimX, dimZ]) 
    for i in range(0, dimZ): 
     W[:,i] = multivariate_normal.rvs(mean=np.zeros(dimX), cov=1) 
    return W 

w0 = np.random.randn(dimX, dimZ) 

W = pymc.Stochastic(
    logp = W_logp, 
    doc = 'Transformation', 
    name = 'W', 
    parents = {}, 
    random = W_random, 
    trace = True, 
    value = w0, 
    dtype = float, 
    rseed = 116., 
    observed = False, 
    cache_depth = 2, 
    plot = False, 
    verbose = 0) 

대한 분포를 정의 이것은 다시 다 변수 일반 (제로 평균 및 ID 공분산)입니다. 그러나 각각의 관찰에 대해 z을 따로 따로 그려야하며 W은 모두 모든 관찰에 대해 공통적입니다. 그래서, 그러나, pymc.MvNormal크기 매개 변수가없는

z = pymc.MvNormal('z', np.zeros(dimZ), np.eye(dimZ), size=N) 

을 시도했다. 따라서 오류가 발생합니다. 다음 단계는

m = Data.mean(axis=0) + np.dot(W, z) 
obs = pymc.MvNormal('Obs', m, C, value=Data, observed=True) 

내가 그것을 지금은 관계가 있기 때문에 위의 에 대한 C을 사양을 포기하지 않았다 것입니다. 어떤 아이디어를 구현하는 방법?

감사

편집

numD, dimX = Data.shape 
dimZ = 3 
mm = Data.mean(axis=0) 

tau = pymc.Gamma('tau', alpha=10, beta=2) 
tauW = pymc.Gamma('tauW', alpha=20, beta=2, size=dimZ) 

@pymc.deterministic(dtype=float) 
def C(tau=tau): 
    return (tau)*np.eye(dimX) 

@pymc.deterministic(dtype=float) 
def CW(tau=tauW): 
    return np.diag(tau) 

W = [pymc.MvNormal('W%i'%i, np.zeros(dimZ), CW) for i in range(dimX)] 
z = [pymc.MvNormal('z%i'%i, np.zeros(dimZ), np.eye(dimZ)) for i in range(numD)] 
mu = [pymc.Lambda('mu%i'%i, lambda W=W, z=z: mm + np.dot(np.array(W), np.array(z[i]))) for i in range(numD)] 

obs = [pymc.MvNormal('Obs%i'%i, mu[i], C, value=Data[i,:], observed=True) for i in range(numD)] 

model = pymc.Model([tau, tauW] + obs + W + z) 
mcmc = pymc.MCMC(model) 

그러나이 시간을 다음과 같이 크리스 Fonnesbeck의 대답은 내 코드를 변경 후에는 (8기가바이트보다) 대량의 메모리를 할당하려고

pymc.MCMC(model), numD=45dimX=504으로 실행하십시오. numD=1 만 시도해도 (따라서 1 z, muobs 만 생성해도 마찬가지입니다). 왜 그런가?

답변

3

불행히도 PyMC는 다 변수 스토캐스틱의 벡터를 쉽게 정의 할 수 없습니다. 바라기를 우리는 이것을 PyMC 3에서 만들 수 있기를 바랍니다. 지금은 컨테이너를 사용하여 이것을 지정해야합니다. 예 :

z = [pymc.MvNormal('z_%i' % i, np.zeros(dimZ), np.eye(dimZ)) for i in range(N)] 
+0

답변 해 주셔서 감사합니다. PyMC에서 그래픽 모델처럼 __plates__를 사용할 방법이 있습니까? 사실, 예를 들어 그래픽 모델을 먼저 제공하고 PyMC에서 코딩하는 것이 매우 유용 할 것입니다. – ahmethungari

+0

내 EDIT 질문을 참조하십시오. – ahmethungari

1

메모리 문제와 관련하여 다른 백엔드를 사용해보십시오. 기본값 ("ram")은 모든 것을 RAM에 유지합니다. 대신 "pickle" 또는 "sqlite"과 같은 것을 시도 할 수 있습니다.

플레이트 표기법에 대해서는 PyMC 3에서 추구 할 수있는 것일 수 있습니다. our issue tracker에 제안하는 문제를 자유롭게 작성하십시오.