Передумови та проблеми
Я використовую Гауссові процеси (GP) для регресії та подальшої байєсівської оптимізації (BO). Для регресії я використовую пакет gpml для MATLAB з кількома модифікаціями на замовлення, але проблема загальна.
Загальновідомий факт, що коли два тренувальних введення занадто близькі у вхідному просторі, коваріаційна матриця може стати не позитивно визначеною (на цьому сайті є кілька питань). Як результат, розклад Холеського матриці коваріації, необхідний для різних обчислень GP, може вийти з ладу через помилку числення. Це траплялося зі мною в декількох випадках, коли виконував БО цільові функції, якими я користуюся, і я хотів би це виправити.
Запропоновані рішення
AFAIK, стандартним рішенням для полегшення поганого кондиціонування є додавання хребта або самородка до діагоналі коваріаційної матриці. Для регресії загальної практики це означає додавання (або збільшення, якщо вже є) спостережного шуму.
Все йде нормально. Я змінив код для точного виведення gpml, щоб, коли розклад Холеського не вдався, намагаюся зафіксувати матрицю коваріації до найближчої симетричної матриці позитивного певного (SPD) у нормі Фробеніуса, натхненної цим кодом MATLAB Джоном д'Еріко. Обґрунтуванням є мінімізація втручання на початковій матриці.
Цей спосіб вирішує цю роботу, але я помітив, що ефективність роботи BO істотно знижується для деяких функцій - можливо, коли алгоритм потребує збільшення в деякій області (наприклад, тому, що він наближається до мінімуму або тому, що масштаб довжини проблеми стають нерівномірно малими). Така поведінка має сенс, оскільки я ефективно збільшую шум, коли дві точки входу занадто близько, але, звичайно, це не ідеально. Крім того, я міг би просто видалити проблемні точки, але знову ж таки, іноді мені потрібні вхідні точки, щоб вони були близькими.
Питання
Я не думаю, що чисельні проблеми з Чолеским коефіцієнтом коваріаційних матриць GP є новою проблемою, але, на мій подив, я не міг знайти багато рішень поки що не збільшуючи шум або видаляючи точки, що знаходяться занадто близько один до одного. З іншого боку, це правда, що деякі мої функції досить погано поводяться, тому, можливо, моя ситуація не така типова.
Будь-яка пропозиція / посилання, які можуть бути корисні тут?