2014-04-25 2 views
1

나는 간단하고 어리 석었던 파이썬 문제가 있습니다. 그래프가 주어진다면 그래프 분포도와 같은 확률 변수로부터 샘플을 추출하려고합니다.그래프의도 분포에서 샘플링하기

이것은 매우 간단해야합니다. 그러나 어쨌든 나는 이것을 계속 엉망으로 다루고있다. 내 코드는 다음과 같습니다

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"을 반환하지 않으므로 어떤 식 으로든 어떻게 든 이동합니다.

여기에서 무슨 일이 일어나는지 명확히 알 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다!

+0

당신이 경우 "라고

대신, 여담으로

x.rvs(size=1) 

을 원하는, 당신이를 교체 할 것을 권 해드립니다 나는 대신 "글을 쓸 것입니다.하지만 다른 줄이 있다면 동일한 줄을 복사합니까? – askewchan

+0

아, 네 말이 맞아. 나는 편집을했다. – gogurt

+0

'range (len (count))'는'value'와 같은 값을 갖고 있습니까? – askewchan

답변

3

x.rvs()에 대한 첫 번째 인수는 loc arg 일 것입니다. x.rvs(1)으로 전화하여 loc=1을 작성하면 모든 값에 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 
+0

내가 잘못 생각할 수도 있지만, 이전 버전의 Python은 정규화에서 숨겨진 정수 나누기를 강제 할 수 있습니다. 배열을 부동 소수점 표현으로 캐스트 ('.astype') 할 수 있습니다. – Hooked

+0

고마워요. @Hooked, done. 또 다른 해결책은 '보통 __future__ 수입 구분'에서 나옵니다. – askewchan

+0

아, 좋아. 그 문제를 해결해 주셔서 감사합니다. 나는 문서에 더 많은주의를 기울여야했다. 어쨌든, 당신은 나를 많이 돕고 있습니다. 감사합니다! – gogurt

관련 문제