2017-07-20 191 views
0

選擇一個特定的值,所以我有以下MCMC採樣 - !如何從列表蟒蛇

import numba 
import numpy as np 
import scipy.stats as stats 
from scipy.stats import multivariate_normal 
import seaborn as sns 
import pandas as pd 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 
import random 
import math 

def targ_dist2(x1,x2): 

    target2 = (mlab.bivariate_normal(x1, x2, 1.0, 1.0, -6, -6, 0.9) + 
mlab.bivariate_normal(x1, x2, 1.0, 1.0, 4, 4, -0.9) + 
mlab.bivariate_normal(x1, x2, 1.0, 1.0, 0.0, 0.0))/3 
    return target2 

nSamples = 5000 
propSigma = 2  
x = np.zeros((nSamples+1,2)) 
xCurrent = stats.uniform.rvs(loc=-5, scale=10, size=2, random_state=None) 
dims = range(2) 

#INITIAL VALUES 
t = 0 
x[t,0] = xCurrent[0] 
x[t,1] = xCurrent[1] 

while t < nSamples: 
    t = t + 1 
    for iD in range(2): 
     xStar = np.random.normal(x[t-1,iD], propSigma) 
     alpha = min(1, (targ_dist2(xStar, x[t-1,iD!=dims])/targ_dist2(x[t- 
     1,iD], x[t-1,iD!=dims]))) 

     #ACCEPT OR REJECT 
     u = random.uniform(0, 1) 
     if u < alpha: 
      x[t,iD] = xStar 
     else: 
      x[t,iD] = x[t-1,iD] 

我的錯誤是在那裏我有=在alpha方程。基本上,我想在循環中選擇不等於值「iD」的「dims」中的值。因此,例如,如果循環通過值iD = 0工作,我想在上面的alpha方程中使用值1代替iD!= dims(如果有意義的話)。有沒有這樣做的一般方法?我希望延長該算法多個方面...

回答

1

你擁有的東西並沒有什麼意義,因爲你正在比較一個範圍和一個值。 iD是int,但變暗是range,所以比較它們並沒有什麼意義。

也許這樣的事情會更好

def get_opposite(iD, dims): 
    for x in dims: 
     if x != iD: #Beware here for multi dimentional extension 
      return x 

那麼你的問題的行更改爲:

... x[t-1,get_opposite(iD,dims)]... 
+0

太謝謝你了!這似乎工作!你有沒有機會知道如何在多變量情況下擴展它?假設我們在10個維度上工作,例如? – tattybojangler

+0

那麼在10天的情況下會返回什麼?目前我們有'(x,y)',我們返回未給出的值。如果我們有'(x,y,z,k ....)',那麼給出'x'它應該返回什麼? – jprockbelly

0

不知道我得到你想要的,但如果它只是打印ID的相反值,如果它是一個range(2),因此1和0:

for i in range(2): 
    print("i value: ", i) 
    print("opposite:" ,1- i)