#python #plot #gaussian #valueerror #data-fitting
Вопрос:
Я пытаюсь подогнать функцию Гаусса к некоторым данным, но я хочу вернуть значения «центр» и «ширина» и распечатать их. Однако код возвращает ошибку ValueError, и, таким образом, графика нет. Удаление «центра» и «ширины» из строки возврата в функции Гаусса решает проблему, но я не знаю, как иначе извлечь эти значения из подгонки (и как заставить код выводить их в качестве выходных данных после подгонки). Есть какие-нибудь советы?
Код и ошибка:
import matplotlib.pyplot as plt
import pathlib
import os
from scipy.optimize import curve_fit
#Data
data = np.loadtxt('....file.hst')
x = data[:,0]
y1 = data[:,1]
y2 = data[:,2]
n_gauss = 1
offset = 0
def gaussian(x, offset, area, center, width):
y = area * np.exp(-(x - center)**2 / (2 * width**2)) offset
return y, center, width
def multi_gaussian(x, *gaussians):
y = gaussians[0] * np.ones_like(x)
n_gauss = (len(gaussians)-1) // 3
for gauss in range(n_gauss):
y = gaussian(x, offset, gaussians[3*gauss 1], gaussians[3*gauss 2],
gaussians[3*gauss 3])
return y
#Plots:
plt.plot(x, y1, label="sync1")
plt.plot(x, y2, label="sync2")
popt, pcov = curve_fit(gaussian, x, y1, p0=[0, max(y1), 900, 120])
#popt, pcov = curve_fit(gaussian, x, y2, p0=[5000, max(y2), center, width])
#plt.plot(x, gaussian(y1, -2100, 3200, center, width),
# lw=1, c='m', ls='--', label='Gaussian')
plt.plot(x, multi_gaussian(y1, -210, 270, 900, 120),
lw=1, c='r', ls='--', label='multi-Gaussian')
#plt.plot(x, gaussian(y2, 0, 2250, 900, 120),
# lw=1, c='r', ls='--', label='Gaussian')
#plt.xlim([850, 980])
#plt.ylim([30, 600])
plt.legend()
#Outputs
#print("Center: ", center)
#print("Width: ", width)```
The ValueError is:
return func(xdata, *params) - ydata
ValueError: operands could not be broadcast together with shapes (3,) (1201,),
Ответ №1:
Это происходит потому, что ваша функция Гаусса возвращает 3 значения вместо одного, поэтому, возможно, вместо этого попробуйте что-то подобное:
def gaussian(x, offset, area, center, width):
return area * np.exp(-(x - center)**2 / (2 * width**2)) offset
Комментарии:
1. Эй, это работает в том смысле, что я не получаю ошибку значения, но я все равно хочу каким-то образом напечатать ширину и центр (посмотрите, что я получаю для этих значений из подгонки). Если они не определены в ответ, как я могу заставить код выдавать мне эти значения?
2. может быть, хранить их отдельно, а затем распечатать ? Потому что функция curve_fit ожидает функцию, которая просто вернет значение 🙂