从图的度分布中抽样

1 投票
1 回答
642 浏览
提问于 2025-04-18 04:17

我遇到了一个简单的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

撰写回答