Szukaj…


Wprowadzenie

W aplikacjach naukowych często wymagane jest dopasowanie funkcji opisującej oczekiwane występowanie punktów danych w rzeczywistych danych. Możliwym optymalizatorem dla tego zadania jest curve_fit from scipy.optimize. Poniżej podano przykład zastosowania curve_fit.

Dopasowanie funkcji do danych z histogramu

Załóżmy, że istnieje szczyt danych normalnie (gaussowskich) (średnia: 3,0, odchylenie standardowe: 0,3) na tle wykładniczo rozkładającym się. Ten rozkład można dopasować do curve_fit w kilku krokach:

1.) Zaimportuj wymagane biblioteki.

2.) Zdefiniuj funkcję dopasowania, która ma być dopasowana do danych.

3.) Uzyskaj dane z eksperymentu lub wygeneruj dane. W tym przykładzie generowane są losowe dane w celu symulacji tła i sygnału.

4.) Dodaj sygnał i tło.

5.) Dopasuj funkcję do danych za pomocą curve_fit.

6.) (Opcjonalnie) Wykreśl wyniki i dane.

W tym przykładzie zaobserwowane wartości y są wysokościami binscenters histogramu, podczas gdy zaobserwowane wartości x są środkami binscenters histogramu ( binscenters ). Konieczne jest przekazanie nazwy funkcji dopasowania, wartości xi wartości y do curve_fit . Ponadto za pomocą p0 można podać opcjonalny argument zawierający przybliżone oszacowania parametrów dopasowania. curve_fit zwraca popt i pcov , gdzie popt zawiera wyniki dopasowania parametrów, natomiast pcov jest macierzą kowariancji, której elementy ukośne reprezentują wariancję dopasowanych parametrów.

# 1.) Necessary imports.    
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 2.) Define fit function.
def fit_function(x, A, beta, B, mu, sigma):
    return (A * np.exp(-x/beta) + B * np.exp(-1.0 * (x - mu)**2 / (2 * sigma**2)))

# 3.) Generate exponential and gaussian data and histograms.
data = np.random.exponential(scale=2.0, size=100000)
data2 = np.random.normal(loc=3.0, scale=0.3, size=15000)
bins = np.linspace(0, 6, 61)
data_entries_1, bins_1 = np.histogram(data, bins=bins)
data_entries_2, bins_2 = np.histogram(data2, bins=bins)

# 4.) Add histograms of exponential and gaussian data.
data_entries = data_entries_1 + data_entries_2
binscenters = np.array([0.5 * (bins[i] + bins[i+1]) for i in range(len(bins)-1)])

# 5.) Fit the function to the histogram data.
popt, pcov = curve_fit(fit_function, xdata=binscenters, ydata=data_entries, p0=[20000, 2.0, 2000, 3.0, 0.3])
print(popt)

# 6.)
# Generate enough x values to make the curves look smooth.
xspace = np.linspace(0, 6, 100000)

# Plot the histogram and the fitted function.
plt.bar(binscenters, data_entries, width=bins[1] - bins[0], color='navy', label=r'Histogram entries')
plt.plot(xspace, fit_function(xspace, *popt), color='darkorange', linewidth=2.5, label=r'Fitted function')

# Make the plot nicer.
plt.xlim(0,6)
plt.xlabel(r'x axis')
plt.ylabel(r'Number of entries')
plt.title(r'Exponential decay with gaussian peak')
plt.legend(loc='best')
plt.show()
plt.clf()

Dopasuj do danych histogramu



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow