Подбор гамма-функции. OptimizeWarning: ковариацию параметров невозможно оценить в Python.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Подбор гамма-функции. OptimizeWarning: ковариацию параметров невозможно оценить в Python.

Сообщение Anonymous »

Я пытаюсь подогнать функции к гистограммам с помощью Curve_fit из scipy, однако при запуске программы появляется предупреждение:

Код: Выделить всё

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()

OptimizeWarning: не удалось оценить ковариацию параметров

Код: Выделить всё

params_gamma, cov_gamma = curve_fit(gamma, x, y, init_gamma)
Я не уверен, в чем здесь проблема.
Я думал, что проблема связана с интервалами гистограммы, и попробовал установить для нее значение «авто». ', также меняется плотность, но предупреждение появляется снова. Та же проблема возникла при аппроксимации гауссиана, и после добавления плотности=True ковариация была успешно оценена, но она не работает для аппроксимации гаммы.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ould-not-b
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»