In the Curve Fitter app, select curve data. On the Curve Fitter tab, in the Data section, click Select Data. In the Select Fitting Data dialog box, select X Data and Y Data, or just Y Data against an index. Click the arrow in the Fit Type section to open the gallery, and click Gaussian in the Regression Models group.
Click and drag to highlight cells D2 to E10. Click the "Insert" tab, click on the scatter chart icon in the Charts section, and then select the "Scatter with Smooth Lines" chart. Excel creates your Gaussian curve in chart form.
Gaussian functions are widely used in statistics to describe the normal distributions, in signal processing to define Gaussian filters, in image processing where two-dimensional Gaussians are used for Gaussian blurs, and in mathematics to solve heat equations and diffusion equations and to define the Weierstrass ...
Take a look at this answer for fitting arbitrary curves to data. Basically you can use scipy.optimize.curve_fit
to fit any function you want to your data. The code below shows how you can fit a Gaussian to some random data (credit to this SciPy-User mailing list post).
import numpy
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# Define some test data which is close to Gaussian
data = numpy.random.normal(size=10000)
hist, bin_edges = numpy.histogram(data, density=True)
bin_centres = (bin_edges[:-1] + bin_edges[1:])/2
# Define model function to be used to fit to the data above:
def gauss(x, *p):
A, mu, sigma = p
return A*numpy.exp(-(x-mu)**2/(2.*sigma**2))
# p0 is the initial guess for the fitting coefficients (A, mu and sigma above)
p0 = [1., 0., 1.]
coeff, var_matrix = curve_fit(gauss, bin_centres, hist, p0=p0)
# Get the fitted curve
hist_fit = gauss(bin_centres, *coeff)
plt.plot(bin_centres, hist, label='Test data')
plt.plot(bin_centres, hist_fit, label='Fitted data')
# Finally, lets get the fitting parameters, i.e. the mean and standard deviation:
print 'Fitted mean = ', coeff[1]
print 'Fitted standard deviation = ', coeff[2]
plt.show()
You can try sklearn gaussian mixture model estimation as below :
import numpy as np
import sklearn.mixture
gmm = sklearn.mixture.GMM()
# sample data
a = np.random.randn(1000)
# result
r = gmm.fit(a[:, np.newaxis]) # GMM requires 2D data as of sklearn version 0.16
print("mean : %f, var : %f" % (r.means_[0, 0], r.covars_[0, 0]))
Reference : http://scikit-learn.org/stable/modules/mixture.html#mixture
Note that in this way, you don't need to estimate your sample distribution with an histogram.
Kind of an old question, but for anybody looking just to plot a density fit for a series, you could try matplotlib's .plot(kind='kde')
. Docs here.
Example with pandas:
mydf.x.plot(kind='kde')
I am not sure what your input is, but possibly your y-axis scale is too large (20000), try reducing this number. The following code works for me:
import matplotlib.pyplot as plt
import numpy as np
#created my variable
v = np.random.normal(0,1,1000)
fig, ax = plt.subplots()
plt.hist(v, bins=500, normed=1, color='#7F38EC', histtype='step')
#plot
plt.title("Gaussian")
plt.axis([-1, 2, 0, 1]) #changed 20000 to 1
plt.show()
Edit:
If you want the actual count of values on y-axis, you can set normed=0
. And would just get rid of the plt.axis([-1, 2, 0, 1])
.
import matplotlib.pyplot as plt
import numpy as np
#function
v = np.random.normal(0,1,500000)
fig, ax = plt.subplots()
# changed normed=1 to normed=0
plt.hist(v, bins=500, normed=0, color='#7F38EC', histtype='step')
#plot
plt.title("Gaussian")
#plt.axis([-1, 2, 0, 20000])
plt.show()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With