파이썬 용 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=45
및
dimX=504
으로 실행하십시오.
numD=1
만 시도해도 (따라서 1
z
,
mu
및
obs
만 생성해도 마찬가지입니다). 왜 그런가?
답변 해 주셔서 감사합니다. PyMC에서 그래픽 모델처럼 __plates__를 사용할 방법이 있습니까? 사실, 예를 들어 그래픽 모델을 먼저 제공하고 PyMC에서 코딩하는 것이 매우 유용 할 것입니다. – ahmethungari
내 EDIT 질문을 참조하십시오. – ahmethungari