从图的度分布中抽样
我遇到了一个简单的Python问题。给定一个图,我想从一个随机变量中抽样,这个随机变量的分布应该和这个图的度分布一样。
这看起来应该很简单。然而,我还是搞砸了。我的代码是这样的:
import numpy as np
import scipy as sp
import graph_tool.all as gt
G = gt.random_graph(500, deg_sampler=lambda: np.random.poisson(1), directed=False)
deg = gt.vertex_hist(G,"total",float_count=False)
# Extract counts and values
count = list(deg[0])
value = list(deg[1])
# Generate vector of probabilities for each node
p = [float(x)/sum(count) for x in count]
# Load into a random variable for sampling
x = sp.stats.rv_discrete(values=(value,p))
print x.rvs(1)
但是,当我运行这个代码时,它返回了一个错误:
Traceback (most recent call last):
File "temp.py", line 16, in <module>
x = sp.stats.rv_discrete(values=(value,p))
File "/usr/lib/python2.7/dist-packages/scipy/stats/distributions.py", line 5637, in __init__
self.pk = take(ravel(self.pk),indx, 0)
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 103, in take
return take(indices, axis, out, mode)
IndexError: index out of range for array
我不太明白为什么会这样。如果在上面的代码中我改成:
x = sp.stats.rv_discrete(values=(range(len(count)),p))
那么代码就能正常运行,但结果却很奇怪——显然我指定的这个分布中,“0”应该是最常见的值。但是这个代码却高概率返回“1”,而且从来不会返回“0”,所以某种东西似乎被偏移了。
有没有人能帮我解释一下这是怎么回事?任何帮助都非常感谢!
1 个回答
3
我认为x.rvs()
的第一个参数应该是loc
这个参数。如果你通过调用x.rvs(1)
来设置loc=1
,那么你就是在所有的值上加上了1
。
相反,你想要的是
x.rvs(size=1)
顺便说一下,我建议你把这个:
# Extract counts and values
count = list(deg[0])
value = list(deg[1])
# Generate vector of probabilities for each node
p = [float(x)/sum(count) for x in count]
换成:
count, value = deg # automatically unpacks along first axis
p = count.astype(float) / count.sum() # count is an array, so you can divide all elements at once