2016-11-18 15 views
0

Поэтому у меня есть два списка данных, которые я могу участок в точечную, как таковой:Установка половины кривой Гаусса/нормировка данных указывает

from matplotlib import pyplot as plt 
x = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
y = [22.4155688819,22.3936180362,22.3177538001,22.1924849792,21.7721194577,21.1590235248,20.6670446864,20.4996957642,20.4260953411,20.3595072628,20.3926201626,20.6023149681,21.1694961343,22.1077417713,23.8270366414,26.5355924353,31.3179807276,42.7871637946,61.9639549412,84.7710953311] 

plt.scatter(degrees,RMS_one_image) 

Это дает вам сюжет, который выглядит как гауссовой распределение, которое хорошо, как и должно быть. Data to plot

Моя проблема, однако, я стараюсь соответствовать распределению Гаусса для этого и терпеть неудачу, потому что a. это всего лишь половина гауссова, а не полная, и б. то, что я использовал раньше, только когда-либо использовал одну группу чисел. Так что-то вроде:

# best fit of data 
num_bins = 20 
(mu, sigma) = norm.fit(sixteen) 

y = mlab.normpdf(num_bins, mu, sigma) 

n, bins, patches = plt.hist(deg_array, num_bins, normed=1, facecolor='blue', alpha=0.5) 
# add a 'best fit' line 
y = mlab.normpdf(bins, mu, sigma) 
plt.plot(bins, y, 'r--') 

Этот подход работает вообще здесь, или я об этом совершенно не так? Спасибо ...

+0

Поскольку мы не знаем, что означает 'norm.fit', мы не можем помочь. Вот, hoqw для создания [минимального полного проверяемого примера] (http://stackoverflow.com/help/mcve). – ImportanceOfBeingErnest

ответ

1

Кажется, что ваше нормальное решение заключается в том, чтобы найти значение ожидания и стандартное отклонение данных напрямую, а не использовать минимальный квадрат. Вот решение using curve_fit из scipy.optimize.

from matplotlib import pyplot as plt 
from scipy.optimize import curve_fit 
import numpy as np 

x = np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]) 
y = [22.4155688819,22.3936180362,22.3177538001,22.1924849792,21.7721194577,21.1590235248,20.6670446864,20.4996957642,20.4260953411,20.3595072628,20.3926201626,20.6023149681,21.1694961343,22.1077417713,23.8270366414,26.5355924353,31.3179807276,42.7871637946,61.9639549412,84.7710953311] 

# Define a gaussian function with offset 
def gaussian_func(x, a, x0, sigma,c): 
    return a * np.exp(-(x-x0)**2/(2*sigma**2)) + c 

initial_guess = [1,20,2,0] 
popt, pcov = curve_fit(gaussian_func, x, y,p0=initial_guess) 

xplot = np.linspace(0,30,1000) 
plt.scatter(x,y) 
plt.plot(xplot,gaussian_func(xplot,*popt)) 

plt.show() 
+0

Работала с небольшой настройкой. Спасибо! :) – kb3hts