Как построить регрессионную модель гауссовского процесса для наблюдений, которые должны быть положительными - PullRequest
1 голос
/ 09 июля 2020

В настоящее время я пытаюсь обучить регрессионную модель GP в GPflow, которая будет предсказывать значения осадков с учетом некоторых метеорологических данных. Я использую ядро ​​Linear+RBF+WhiteNoise, что кажется подходящим, учитывая набор используемых мной предикторов.

Моя проблема в данный момент в том, что когда я получаю модель для предсказания новых значений, она имеет тенденцию для прогнозирования отрицательных осадков - см. прилагаемый рисунок.

Как я могу «наложить» физические ограничения при построении модели? Обучающие данные не содержат никаких отрицательных значений осадков, но они содержат много значений, близких к нулю, что, как я предполагаю, означает, что модель GPR не изучает «осадки должны быть> = 0» ограничение очень хорошо.

Если бы есть способ явно обеспечить такое ограничение, это было бы идеально, но я не уверен, как это сработает. Потребуется ли для этого другой алгоритм оптимизации? Или можно как-то встроить это ограничение в структуру ядра?

введите описание изображения здесь

1 Ответ

2 голосов
/ 09 июля 2020

Это скорее вопрос для CrossValidated ... Гауссовский процесс - это, по сути, распределение по функциям с гауссовскими маргиналами: прогнозируемое распределение f (x) в любой точке по построению гауссово, не сдерживается. Например, если у вас есть много наблюдений, близких к нулю, ваша модель ожидает, что что-то чуть ниже нуля также должно быть очень вероятным.

Если ваши наблюдения строго положительны, вы можете использовать другую вероятность, например, Экспоненциальную (gpflow.likelihoods.Exponential) или бета (gpflow.likelihoods.Beta). Обратите внимание, что model.predict_y() всегда возвращает среднее и дисперсию , а для негауссовских правдоподобий дисперсия может быть не той, которую вы хотите. На практике вас больше интересуют квантили (например, 10% -90% доверительный интервал); на github GPflow есть открытая проблема , которая связана с этим. Какая вероятность, которую вы используете, является частью вашего выбора моделирования и зависит от ваших данных.

Самый простой практический ответ на вашу проблему - рассмотреть возможность моделирования логарифмических осадков: если ваш исходный набор данных - X и YY > 0 для всех записей), вычислите logY = np.log(Y) и создайте свою модель GP, например, используя gpflow.models.GPR((X, logY), kernel). Затем вы прогнозируете logY в контрольных точках, а затем можете преобразовать его обратно из журнала осадков в объем осадков. (Это эквивалентно вероятности LogNormal, которая в настоящее время не реализована в GPflow, хотя это было бы просто.)

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