Мне нужно подогнать двумерный гауссов к набору данных, который я прочитал. Я выбрал подпрограмму подгонки lmfit, поскольку она позволяет легко реализовывать граничные условия и фиксировать параметры. Поскольку я не самый эффективный программист, у меня есть проблемы с реализацией моих потребностей. Вот что я сделал:
from numpy import *
from math import *
from lmfit import Parameters,minimize,report_fit
## fails to run
# from https://www.w3resource.com/python-exercises/numpy/python-numpy-exercise-79.php
x,y = meshgrid(linspace(-1,1,10),linspace(-1,1,10))
#d = sqrt(x*x+y*y)
#sigma, mu = 1.0, 0.0
#g = exp(-( (d-mu)**2 / ( 2.0 * sigma**2 ) ) )
def gaussian2D(p,x,y):
height = p["height"].value
centroid_x = p["centroid_x"].value
centroid_y = p["centroid_y"].value
sigma_x = p["sigma_x"].value
sigma_y = p["sigma_y"].value
background = p["background"].value
return height*exp(-(((centroid_x-x)/sigma_x)**2+((centroid_y-y)/sigma_y)**2)/2.0)+background
def residuals(p,x,y,z):
return z - gaussian2D(p,x,y)
initial = Parameters()
initial.add("height",value=1.)
initial.add("centroid_x",value=0.)
initial.add("centroid_y",value=0.)
initial.add("sigma_x",value=1.)
initial.add("sigma_y",value=3.)
initial.add("background",value=0.)
xx,yy = meshgrid(x,y)
fit = minimize(residuals,initial,args=(array(xx).flatten(),array(yy).flatten(),array(g).flatten()))
popt = fit.params
print report_fit(fit)
Прежде всего, пример кода для генерации двумерного гауссиана не запускается и выдает «TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python» для d = sqrt (x x + y у). Так как я все равно использую данные из файла, я работаю с образцами данных, приведенными на веб-сайте здесь .
Некоторые исследования сказали мне преобразовать двумерные массивы в одномерные данные, чтобы lmfit мог их обрабатывать. Мои попытки реализовать это с помощью метода flatten в моих массивах не увенчались успехом, и я выдал ту же ошибку (TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python). Я недостаточно разбираюсь, чтобы полностью понять код в ссылке.
Буду признателен за любую помощь, особенно поскольку я предпочитаю определять свои собственные функции, которые будут соответствовать данным, а не полагаться на встроенные модели.