所以我有以下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等式中我有!=的地方。基本上我在这里我想选择&#34; dims&#34;这不等于价值&#34; iD&#34;在循环。因此,例如,如果循环正在通过值iD = 0,我想在上面的alpha等式中使用值1代替iD!= dims(如果这有意义)。有没有一般的方法这样做?我希望将这个算法扩展到多个维度......
答案 0 :(得分:1)
你所拥有的并不是很有意义,因为你正在将一个范围与一个值进行比较。 iD是import json
def jsonparse():
user_path= input("Please enter a path name:")
with open(user_path) as f:
for line in f:
with open(line) as x:
jObject = json.loads(x)
print jObject
,但是dims是int
,因此比较它们并不是真的有意义。
也许这样的事情会更好
range
然后将您的违规行更改为:
def get_opposite(iD, dims):
for x in dims:
if x != iD: #Beware here for multi dimentional extension
return x
答案 1 :(得分:0)
不确定我得到了你想要的东西,但是如果只打印iD的相反值,如果它是range(2)
,那么1和0:
for i in range(2):
print("i value: ", i)
print("opposite:" ,1- i)