问题描述
我已经为n维超立方体上的惰性简单随机游走编写了代码。为了可视化它,可以想到一个2D正方形或3D立方体,其中正方形/立方体的角是图形的顶点。此图上的游走始于原点,概率为0.5停留在一个顶点上,并且保持相等的概率访问其邻居。代码正在运行,但是我有一个技术问题。我将稍作解释,但最后,随着时间的增加,固定分布(均匀分布)与通过仿真获得的分布之间的距离必须减小为0。在我的模拟中,对于较大的n(例如n = 10),上述分布之间的距离逐渐缩小为非零值。如果有人可以指出我出了问题的地方,那将是很棒的事情!!
-
此函数生成n-dim超立方体的所有顶点,输出是位串列表的列表,即,超立方体的每个顶点都是n位串,并且有2 ^ n个这样的顶点。
def generateallBinaryStrings(n,arr,l,i): if i == n: l.append(arr[:]) return arr[i] = 0 generateallBinaryStrings(n,i + 1) arr[i] = 1 generateallBinaryStrings(n,i + 1) return l
-
创建一个字典,其键是顶点,值是邻居(每个顶点有n个邻居)
def dictionary(v): d={} for i in range(len(v)): d[str(v[i])]=[] temp=[] for j in range(n): temp=v[i][:] if v[i][j]==1: temp[j]=0 else: temp[j]=1 d[str(v[i])].append(temp) return d
-
在n-dim多维数据集上从原点开始的简单随机游动(输出是在时间t中访问的顶点的列表)
def srw(d,n,t): h=[[0 for i in range(n)]] w=[1/(2*n) for i in range(n)] w.append(0.5) for i in range(t): temp=d[str(h[-1])][:] temp.append(h[-1]) h.append(random.choices(temp,weights=w)[-1]) return h
-
找到静态分布和模拟分布之间的L1距离
def tvdist(d,t,num): finalstate=[] for i in range(num): temp=srw(d,t) finalstate.append(temp[-1]) temp2=[list(item) for item in set(tuple(row) for row in finalstate)] Xt={} for state in temp2: Xt[str(state)]=None for state in temp2: count=0 for i in finalstate: if i==state: count+=1 Xt[str(state)]=count/num dist=0 for state in d: if state in Xt: dist+=abs(Xt[str(state)]-(1/(2**n))) else: dist+=1/(2**n) dist=0.5*(dist) return dist
-
如果您复制代码,请在上面粘贴代码,然后运行以下代码(将距离与时间作图,n = 5,10)
import numpy as np import matplotlib.pyplot as plt import random import collections as cs time=30 numsim=5000 for n in range(5,11,5): l = [] arr = [None] * n vertices=generateallBinaryStrings(n,0) d=dictionary(vertices) tvdistance=[] for t in range(1,time): tvdistance.append(tvdist(d,numsim)) plt.plot(tvdistance) plt.show()
-
我得到这个图:(n = 5看起来正确,但n = 10逐渐减小为非零值)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)