#python #scipy #exponential #kolmogorov-smirnov
#python #scipy #экспоненциальный #колмогоров-смирнов
Вопрос:
Я знаю, что здесь уже есть несколько похожих вопросов, но ни один из них не отвечает на мой конкретный вопрос.
У меня есть массив отдельных значений (черный квадрат на картинке). А теперь хочу проверить, значительно ли черные квадраты отличаются от красной линии, которую я создал, подгоняя экспоненциальное уравнение к данным. Подгонка была создана следующим образом:
def exponential_equation(x, k, c):
return np.exp(-(x - c) / k)
def fit_exp(x, y):
popt, pcov = curve_fit(exponential_equation, x, y, p0=[0.1, 0.1])
k = popt[0]
c = popt[1]
return k, c
k, c = fit_exp(x_array, y_array)
Как вы можете видеть, показательное уравнение, которое я использовал, немного отличается от «стандартного» экспоненциального уравнения, поэтому выполнение чего-то вроде pval = scipy.stats.kstest(y_array, "expon")[1]
не работает.
Я думал, что сработает что-то похожее на pval = scipy.stats.kstest(y_array, exponential_equation, args=(k,c)[1]
, но это также возвращает значение pvalue 2.68e-104
, и, оценивая соответствие на глаз, кажется, что значение pvalue должно быть выше 0,05..
Если бы кто-нибудь мог сказать мне, что я делаю неправильно, или мог указать мне правильное направление, я был бы очень рад!
Приветствия!
Ответ №1:
На случай, если кто-то посмотрит это позже, это то, что я в итоге сделал, и я думаю, что результаты выглядят достойно:
def exponential_equation(x, k, c):
return np.exp(-(x - c) / k)
def cdf_exp(b, k, c):
max_cdf = quad(exponential_equation, 0, np.inf, args=(k, c))[0]
return [quad(exponential_equation, 0, i, args=(k, c))[0] / max_cdf for i in b]
k = 0.2
c = 0.01
pvalue = scipy.stats.kstest(test_array, cdf_exp, args=(k,c))[1]
Если кто-то увидит ошибку, пожалуйста, дайте мне знать, но я уверен, что это делает то, что я хочу.