2014-03-27 2 views
2

У меня есть список чисел, который при построении по его длине дает мне гауссовский. Я хотел бы рассчитать стандартное отклонение от этого гаусса, но значение, которое я получаю (используя функцию np.std()), явно слишком мало (я получаю что-то вроде 0.00143 ... когда это должно быть что-то вроде 8.234 ...). Я думаю, что я вычислял стандартное отклонение по оси y, а не по оси x (на которой предполагается стандартное отклонение), но я немного зациклен на том, как это сделать ?Вычислить стандартное отклонение гауссовского

Я включил свой код и рис. Gaussian. Я пытаюсь вычислить std dev.

#max_k_value_counter counts the number of times the maximum value of k comes up. 

max_k_value_counter_sum = sum(max_k_value_counter) 
prob_max_k_value = [0] * len(max_k_value_counter) 

# Calculate the probability of getting a particular value for k 
for i in range(len(max_k_value_counter)): 
     prob_max_k_value[i] = float(max_k_value_counter[i])/max_k_value_counter_sum 

print "Std dev on prob_max_k_value", np.std(prob_max_k_value) 

# Plot p(k) vs k_max to calculate the errors on k 
plt.plot(range(len(prob_max_k_value)), prob_max_k_value) 
plt.xlim(0, 200) 
plt.xlabel(r"$k$", fontsize=16) 
plt.ylabel(r"$p(k)$", fontsize=16) 
plt.show() 

enter image description here

+0

Можете ли вы предоставить свои данные? Возможно, в пастебине? – Ffisegydd

+0

Вот ссылка на pastebin: http://pastebin.com/nSnvuQLi – Calculus5000

ответ

4

вы измеряете стандартное отклонение вероятностей не фактические значения; Вот, пример, где я черпаю от истинного стандартного нормального распределения:

>>> from scipy.stats import norm 
>>> xs = np.linspace(-3, 3, 100) 
>>> pdf = norm.pdf(xs) 
>>> prob = pdf/pdf.sum() # these are probabilities 
>>> np.std(prob)   # note the very small value below 
0.008473522157507624 

Правильный путь здесь, чтобы использовать эту формулу: variance

для измерения дисперсии, а затем взять квадратный корень, чтобы получить стандартный отклонение; Первый член в основном второй момент и второе слагаемое среднеквадратическое:

>>> mu = xs.dot(prob)    # mean value 
>>> mom2 = np.power(xs, 2).dot(prob) # 2nd moment 
>>> var = mom2 - mu**2    # variance 
>>> np.sqrt(var)      # standard deviation 
0.98764819824739092 

Обратите внимание, что значение, которое мы получаем очень близко к 1, что согласуется с тем фактом, что я рисую от стандартного нормального;

+0

Привет, спасибо за обмен. Это имеет смысл. Но я новичок в python, и я не понимаю первые две строки кода, которые у вас есть во втором поле кода. Не могли бы вы вкратце объяснить их, пожалуйста? – Calculus5000

+0

@ Calculus5000 'np.dot' - [dot product] (http://en.wikipedia.org/wiki/Dot_product#Algebraic_definition); базисное суммирование элементарного произведения двух массивов; –

Смежные вопросы