Построение 95% доверительных интервалов GP в Python

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

Красная линия представляет верхний CI, синяя линия представляет нижний CI, а черная линия - мои оценочные данные. Я написал следующий код для этого

f3 = plt.figure()
plt.plot(X_te_rescale[:,0],pred_y.ravel(),'k.',markersize=20,label='prediction')
plt.plot(X_te_rescale[:,0],low_CIs,'b.',markersize=2)
plt.plot(X_te_rescale[:,0],Upper_CIs,'r.',markersize=2)
plt.legend(loc='1')
plt.show()

Я искал в гугле и нашел fill betweenможет быть полезно для этого и, следовательно, использовал его, и результат тоже плохой. см. график ниже

Основной код GP

pred_y, sigma = gpr.predict(X_te_rescale, return_std=True)
confidence_interval = sigma * 1.96
low_CIs=pred_y - confidence_interval
Upper_CIs= pred_y + confidence_interval

Код, который я написал для этого, выглядит следующим образом

plt.scatter(X_tr_rescale, y_tr_rescale, label='Train data')
plt.fill_between(X_te_rescale[:,0],
                  pred_y[:,0] - confidence_interval,
                  pred_y[:,0] + confidence_interval,
                  facecolor='black', alpha=0.5, label='95% confidence interval')
plt.gca().set_title(gp.kernel_)
plt.plot(X_te_rescale, pred_y, 'r.',label='Prediction')

Подробности данных следующие.

y_te_rescale: Array of floats64 (1188,1)
sigma: Array of floats64 (1188,)
Confidence interval: Array of floats64 (1188,)
lower CIs: Array of floats64 (1188,1188)
upper CIs: Array of floats64 (1188,1188)
pred_y: Array of floats64 (1188,1)

Возможно ли иметь CI, который не перекрывает мои оценочные значения? Или что-то мне не хватает. Заранее спасибо. Основываясь на комментариях, я изменил код, как показано ниже.

x_unsorted=X_te_rescale.flatten()
pred_y=pred_y.flatten()
sorted_inds = np.argsort(x_unsorted)
plt.fill_between(
    x_unsorted[sorted_inds],
    (pred_y - confidence_interval)[sorted_inds],
    (pred_y+ confidence_interval)[sorted_inds],
    label='95% CI',
)
plt.plot(
    x_unsorted[sorted_inds], 
    pred_y.ravel[sorted_inds], 
    'r--',
    label='Prediction',
)

Это дает график, как показано ниже

Приведенный выше код показывает доверительный интервал, но не может оценить значение. Это правильный код? или как построить доверительные интервалы вместе с расчетным значением, которое можно четко увидеть.

1 ответ

Проблема с вашим использованием plt.fill_between в том, что значения x не отсортированы. plt.plot приведет к такому же плохому результату, если вы будете рисовать линию вместо набора точек.

Попробуйте что-то вроде этого:

sorted_inds = np.argsort(x_unsorted)
plt.fill_between(
    x_unsorted[sorted_inds],
    (y_pred - conf_intervals)[sorted_inds],
    (y_pred + conf_intervals)[sorted_inds],
    label='95% CI',
)
plt.plot(
    x_unsorted[sorted_inds], 
    y_pred[sorted_inds], 
    'k-',
    label='Prediction',
)
Другие вопросы по тегам