2014-01-30 4 views
0

내가 모델링하고 나는 주식보고 있었다 자산 클래스의 분산 - 공분산 행렬이 너무 반환 추정 할 필요가 추정 반환 여기 https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-HackersPyMC은 - 공분산에 대한 wishart 분포가

의 6 장에 주어진 예 내 간단한 구현 곳이다 나는 알려진 평균과 분산 - 공분산 행렬을 가진 다변량 법선을 사용하는 샘플부터 시작합니다. 나는 정보가없는 priror를 사용하여 그것을 추정하려고 노력한다.

추정치가 알려진 이전과 다르므로 구현이 올바른지 잘 모르겠습니다. 누군가 내가 잘못하고있는 것을 지적 해 주시면 고맙겠습니다.

import numpy as np 
import pandas as pd 
import pymc as pm 


p=3 
mu=[.03,.05,-.02] 
cov_matrix= [[.025,0.0075, 0.00175],[0.0075,.007,0.00135],[0.00175,0.00135,.00043]] 

n_obs=10000 
x=np.random.multivariate_normal(mu,cov_matrix,n_obs) 

prior_mu=np.ones(p) 

prior_sigma = np.eye(p) 


post_mu = pm.Normal("returns",prior_mu,1,size=p) 
post_cov_matrix_inv = pm.Wishart("cov_matrix_inv",n_obs,np.linalg.inv(cov_matrix)) 

obs = pm.MvNormal("observed returns", post_mu, post_cov_matrix_inv, observed = True, value = x) 

model = pm.Model([obs, post_mu, post_cov_matrix_inv]) 
mcmc = pm.MCMC() 

mcmc.sample(5000, 2000, 3) 

mu_samples = mcmc.trace("returns")[:] 
mu_samples.mean(axis=0) 
cov_inv_samples = mcmc.trace("cov_matrix_inv")[:] 
mean_covariance_matrix = np.linalg.inv(cov_inv_samples.mean(axis=0)) 

답변

0

여기에 내가 그 코드 + 추론 향상시킬 수 있도록합니다 몇 가지 제안은 다음과 같습니다

  1. 나는 것 pm.Wishart("cov_matrix_inv",n_obs,np.linalg.inv(cov_matrix)) 더 객관적이기 때문에 pm.Wishart("cov_matrix_inv",n_obs,np.eye(3)) 에가 (10000 개 데이터 이전에 귀하의 포인트

  2. mcmc = pm.MCMC()이 있어야합니다) 많은 어쨌든 중요하지 않을 mcmc = pm.MCMC(model)

  3. mcmc.sample(5000, 2000, 3) 여기에 샘플이 많습니다. MCMC의 후반부 인 몬테카를로 (Monte Carlo)는 샘플이 많을 때 가장 강력합니다. 여기에 1000 개 밖에 없기 때문에 Monte Carlo로 인한 오류가 상당히 클 것입니다 (샘플 크기가 증가하면 오류가 줄어 듭니다). 또한, MCMC는 2000 번 화상 후에 수렴하지 않을 가능성이 높습니다. plot으로 수렴을 확인하고 pymc.Matplot을 호출하고 plot(mcmc)을 호출 할 수 있습니다. mcmc.sample(25000, 15000, 1) 을 사용하여 더 나은 결과를 얻었습니다.

그런 낮은 샘플을 사용한 이유가 성능이라고 생각합니다. 그 중 많은 부분이 많은 샘플로 인해 발생합니다. 즉, 10000 개의 관측치가 있습니다. 그것은 실제로 당신이 실제로 가지고있는 것에 대해 상당히 높을 수 있습니다.

베이지안 추론의 가치 중 상당수는 사후 샘플을 제공한다는 것을 기억하십시오. 이러한 샘플의 평균을 취하는 것은 낭비처럼 보입니다. 손실 함수에서 샘플을 사용하는 것을 생각하십시오 (이 책의 5 장 참조).

+0

의견을 주셔서 감사합니다! 나는 당신이 제안한대로 변화를 구현했고 그것이 효과를 낸다. 주제에 대한 더 많은 문헌을 검토 한 후, 하나의 중요한 개선점은 wishart 분포에서 생성 된 공분산 행렬이 관측 수에 의해 축소 될 필요가 있다는 것입니다. 나는이 게시물에 위의 개선 사항을 게시했습니다 - http://stackoverflow.com/questions/21711150/pymc-variance-covariance-matrix-estimation – akhil

0

유익한 정보를 사용하려면 np.linalg.inv(cov_matrix)Wishart으로 사용하지 말고 단지 cov_matrix을 사용해야합니다. 정확하게 말하자면, 정확하게 축척을 맞추기 위해 cov_matrix * n_obs을 사용해야합니다.