UPD: Спасибо, все работает.
У меня есть 1D-вектор, который представляет собой гистограмму. Это выглядит как сумма нескольких гауссовых функций:
Я нашел curve_fit
образец кода на SO, но не знаю, как его изменить, чтобы получить больше гауссовских кортежей (mu, sigma). Я слышал, что «curve_fit» оптимизирует только одну функцию (в данном случае одну гауссову кривую).
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def estimate_sigma(hist):
bin_edges = np.arange(len(hist))
bin_centres = bin_edges + 0.5
# 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')
print 'Fitted mean = ', coeff[1]
coeff2 =coeff[2]
print 'Fitted standard deviation = ', coeff2
plt.show()
Эта функция находит одну гауссову кривую, тогда как визуально их 3 или 4:
Пожалуйста, не могли бы вы посоветовать некоторые функции numpy/scipy для достижения gmm-представления 1D vector
в форме ([m1, sigma1],[m2, sigma2],..,[mN,sigmaN])
?
gauss(x, *p)
, например.gauss(x, *p[0:2]) + gauss(x, *p[2:4]) + ...
и подходит к этому. (С дополнительным параметром амплитуды, возможно, для каждого термина.) - person tBuLi   schedule 14.12.2016