лучшая кривая, соответствующая распределению - PullRequest
0 голосов
/ 27 октября 2018

Я пытался использовать полином (3 градуса) для подгонки ряда данных, но кажется, что он все еще не подходит (некоторые точки на графике ниже показаны).Я также попытался добавить функцию журнала, чтобы помочь построить.Но результат также не улучшается.

Какова была бы лучшая подгонка кривой здесь?

Вот точки необработанных данных, которые у меня есть: x_values = [ 0.51,0.56444444,0.61888889 , 0.67333333 , 0.72777778, 0.78222222, 0.83666667, 0.89111111 , 0.94555556 , 1. ] y_values = [0.67154591, 0.66657266, 0.65878351, 0.6488696, 0.63499979, 0.6202393, 0.59887225, 0.56689689, 0.51768976, 0.33029004]

Результаты с полиномиальным соответствием: enter image description here

1 Ответ

0 голосов
/ 27 октября 2018

Было бы лучше, если бы ваша процедура подбора кривой основывалась на гипотезах, т. Е. У вас уже было представление о том, каких отношений ожидать.Форма выглядела мне больше как экспоненциальная функция:

from matplotlib import pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

#the function that describes the data    
def func(x, a, b, c, d):
    return a * np.exp(b * x + c) + d

x_values = [0.51,0.56444444, 0.61888889, 0.67333333 , 0.72777778, 0.78222222, 0.83666667, 0.89111111 , 0.94555556 , 1.  ]
y_values = [0.67154591, 0.66657266, 0.65878351, 0.6488696, 0.63499979, 0.6202393, 0.59887225, 0.56689689, 0.51768976, 0.33029004]

#start values [a, b, c, d]
start = [-.1, 1, 0, .1]
#curve fitting
popt, pcov = curve_fit(func, x_values, y_values, p0 = start)
#output [a, b, c, d]
print(popt)

#calculating the fit curve at a better resolution
x_fit = np.linspace(min(x_values), max(x_values), 1000)
y_fit = func(x_fit, *popt)

#plot data and fit
plt.scatter(x_values, y_values, label = "data")
plt.plot(x_fit, y_fit, label = "fit")
plt.legend()
plt.show()

Это дает следующий вывод:

enter image description here

Это все еще выглядитне правильно, первая часть, кажется, имеет линейное смещение.Если принять это во внимание:

from matplotlib import pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

def func(x, a, b, c, d, e):
    return a * np.exp(b * x + c) + d * x + e

x_values = [0.51,0.56444444, 0.61888889, 0.67333333 , 0.72777778, 0.78222222, 0.83666667, 0.89111111 , 0.94555556 , 1.  ]
y_values = [0.67154591, 0.66657266, 0.65878351, 0.6488696, 0.63499979, 0.6202393, 0.59887225, 0.56689689, 0.51768976, 0.33029004]

start = [-.1, 1, 0, .1, 1]
popt, pcov = curve_fit(func, x_values, y_values, p0 = start)
print(popt)

x_fit = np.linspace(min(x_values), max(x_values), 1000)
y_fit = func(x_fit, *popt)

plt.scatter(x_values, y_values, label = "data")
plt.plot(x_fit, y_fit, label = "fit")
plt.legend()
plt.show()

у нас будет следующий вывод: enter image description here

Теперь это ближе к вашим точкам данных.НО.Вам следует обратиться к своим данным и подумать о том, какая модель наиболее вероятно отражает реальность, а затем реализовать эту модель.Вы всегда можете создать более сложные функции, которые лучше соответствуют вашим данным, но они не обязательно отражают лучшую реальность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...