Як інтерпретувати матрицю коваріації з кривої?


15

Я не надто великий у статистиці, тому вибачте, якщо це спрощене питання. Я підгонка кривого деяких даних, і іноді мої дані найкраще підходить негативний експоненту у вигляді * е ( - Ь * х ) + з , а іноді підходить ближче до з * е ( - Ь * х 2 ) + c . Однак іноді і те, і інше не вдається, і я хотів би повернутися до лінійної форми. Моє запитання полягає в тому, як я можу визначити, яка модель найкраще відповідає конкретному набору даних із отриманої матриці дисперсії-коваріації, яка повертається зае(-бх)+cае(-бх2)+cфункція scipy.optimize.curve_fit () ? Я вважаю, що дисперсія є на одній із діагоналей цієї матриці, але я не знаю, як це інтерпретувати.

ОНОВЛЕННЯ: Спираючись на подібне запитання , я сподіваюся, що матриця дисперсії-коваріації може сказати мені, яка з трьох моделей я намагаюсь найкраще відповідати даним (я намагаюсь прилаштувати багато наборів даних до однієї з цих трьох моделей).

Отримані матриці виглядають приблизно так у наведеному прикладі:

pcov_lin 
[[  2.02186921e-05  -2.02186920e-04]
 [ -2.02186920e-04   2.76322124e-03]]
pcov_exp
[[  9.05390292e+00  -7.76201283e-02  -9.20475334e+00]
 [ -7.76201283e-02   6.69727245e-04   7.90218415e-02]
 [ -9.20475334e+00   7.90218415e-02   9.36160310e+00]]
pcov_exp_2 
[[  1.38338049e-03  -7.39204594e-07  -7.81208814e-04]
 [ -7.39204594e-07   8.99295434e-09   1.92970700e-06]
 [ -7.81208814e-04   1.92970700e-06   9.14746758e-04]]

Ось приклад того, що я роблю:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import scipy.optimize

def exp_func(x, a, b, c):
    return a * np.exp(-b * x) + c

def exp_squared_func(x, a, b, c):
    return a * np.exp(-b * x*x*x) + c

def linear_func(x, a, b):
    return a*x + b

def main():
    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], np.float)
    y = np.array([1, 1, 1, 1, 0.805621, 0.798992, 0.84231, 0.728796, 0.819471, 0.570414, 0.355124, 0.276447, 0.159058, 0.0762189, 0.0167807, 0.0118647, 0.000319948, 0.00118267, 0, 0, 0], np.float)

    p0 = [0.7746042467213462, 0.10347274384077858, -0.016253458007293588]
    popt_lin, pcov_lin      = scipy.optimize.curve_fit(linear_func, x, y)
    popt_exp, pcov_exp      = scipy.optimize.curve_fit(exp_func, x, y)
    popt_exp_2, pcov_exp_2  = scipy.optimize.curve_fit(exp_squared_func, x, y)

    plt.figure()
    plt.plot(x, y, 'ko', label="Original data")
    plt.plot(x, linear_func(x, *popt_lin), 'r-', label='linear')
    plt.plot(x, exp_func(x, *popt_exp), 'b-', label='exponential')
    plt.plot(x, exp_squared_func(x, *popt_exp_2), 'g-', label='exponential squared')
    plt.legend()
    plt.show()

if __name__ == '__main__':
    main()

Чудово, що ви посилаєтесь на це питання CV та, отже, на важливий потік коментарів (b / w rolando2, Frank Harrell, ...), питаючи, чи доцільно вибрати модель post facto на основі придатності. Можливо, краще скористатися попередніми знаннями системи для вибору моделі.
Аман

Це інше питання щодо резюме може бути корисним: stats.stackexchange.com/questions/50830/…
Аман

Чи може це бути корисно, щоб зрозуміти, як інтерпретувати ко-дисперсію матриці stats.stackexchange.com/questions/10795/… - я б сказав, що значення третіх моделей менші, що свідчить про менше відхилення.
user4581

Відповіді:


4

Як уточнення, змінна pcovз scipy.optimize.curve_fit- це кошторисна коваріація оцінки параметра, тобто, вільно кажучи, з урахуванням даних та моделі, скільки інформації є в даних для визначення значення параметра в даній моделі. Тож насправді не підказує, хороша обрана модель чи ні. Дивіться також це .

Проблема, яка є хорошою моделлю, справді є важкою проблемою. Як стверджували статистики

Усі моделі помиляються, але деякі корисні

Тож критерії, які слід використовувати для порівняння різних моделей, залежать від того, чого ви хочете досягти.

Наприклад, якщо ви хочете криву, яка є максимально близькою до даних, ви можете вибрати модель, яка дає найменший залишок . У вашому випадку саме модель funcта розрахункові параметри poptмають найменше значення при обчисленні

numpy.linalg.norm(y-func(x, *popt))

Однак якщо вибрати модель з більшою кількістю параметрів, залишок автоматично зменшиться за рахунок більшої складності моделі. Тоді воно повертається до того, яка мета моделі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.