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

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам