Код: Выделить всё
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.special import gamma as gamma_func
import tkinter as tk
def gaussian(x, m, s):
return (1 / (s * np.sqrt(2 * np.pi))) * (np.exp((-1 / 2) * ((x - m) / s) ** 2))
def gamma(x, k, theta):
return (x ** (k - 1) * np.exp(-x / theta)) / (theta ** k * gamma_func(k))
def display_gaussian(data_set, mean, sigma):
plt.figure()
y, bin_edges = np.histogram(data_set, bins=100, density=True)
x = (bin_edges[:-1] + bin_edges[1:]) / 2
plt.hist(data_set, density=True, color='skyblue', label='Histogram', edgecolor='black')
init_gaussian = [mean, sigma]
params_gaussian, cov_gaussian = curve_fit(gaussian, x, y, init_gaussian)
fit = np.linspace(min(data_set), max(data_set), 1000)
plt.plot(fit, gaussian(fit, *params_gaussian), 'r--',
label=f'Fit: mean={params_gaussian[0]:.2f}, sigma={params_gaussian[1]:.2f}')
plt.xlabel('Distribution')
plt.ylabel('Frequency')
plt.title('Gaussian distribution')
plt.legend()
plt.show(block=False)
def display_gamma(data_set, sigma):
plt.figure()
y, bin_edges = np.histogram(data_set, bins=100, density=True)
x = (bin_edges[:-1] + bin_edges[1:]) / 2
plt.hist(data_set, density=True, color='forestgreen', label='Histogram', edgecolor='black')
shape_guess = 2.0
init_gamma = [shape_guess, sigma]
params_gamma, cov_gamma = curve_fit(gamma, x, y, init_gamma)
fit = np.linspace(min(data_set), max(data_set), 1000)
plt.plot(fit, gamma(fit, *params_gamma), 'y--',
label=f'Fit: mean={params_gamma[0]:.2f}, sigma={params_gamma[1]:.2f}')
plt.xlabel('Distribution')
plt.ylabel('Frequency')
plt.title('Gamma distribution')
plt.legend()
plt.show(block=False)
def run():
mean = float(m_ent.get())
sigma = float(s_ent.get())
data_set = np.random.normal(mean, sigma, 1000)
display_gaussian(data_set, mean, sigma)
display_gamma(data_set, sigma)
root = tk.Tk()
root.title("Input parameters")
root.minsize(400, 300)
m_l = tk.Label(root, text="mean", font=15)
m_l.pack(pady=10)
m_ent = tk.Entry(root)
m_ent.pack(pady=10)
s_l = tk.Label(root, text="sigma", font=15)
s_l.pack(pady=10)
s_ent = tk.Entry(root)
s_ent.pack(pady=10)
run_btn = tk.Button(root, text="Run", command=run, font=15)
run_btn.pack(pady=20)
root.mainloop()
params_gamma, cov_gamma = Curve_fit(gamma, x, y, init_gamma)
Я не уверен, в чем здесь проблема.
Я думал, что проблема связана с интервалами гистограммы, и попробовал установить для нее значение «авто», также изменив плотность, но предупреждение появляется снова . Та же проблема возникла при аппроксимации гауссиана, и после добавления плотности=True ковариация была успешно оценена, но она не работает для аппроксимации гаммы.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ould-not-b