Tło i problem
Korzystam z procesów Gaussa (GP) do regresji i późniejszej optymalizacji bayesowskiej (BO). Do regresji używam pakietu gpml dla MATLAB z kilkoma niestandardowymi modyfikacjami, ale problem jest ogólny.
Jest dobrze znanym faktem, że gdy dwa dane treningowe znajdują się zbyt blisko w przestrzeni wejściowej, macierz kowariancji może stać się niezbyt pozytywna (istnieje kilka pytań na ten temat na tej stronie). W rezultacie rozkład Cholesky'ego macierzy kowariancji, niezbędny do różnych obliczeń GP, może zawieść z powodu błędu numerycznego. Zdarzyło mi się to w kilku przypadkach podczas wykonywania BO przy użyciu funkcji celu, których używam, i chciałbym to naprawić.
Proponowane rozwiązania
AFAIK, standardowe rozwiązanie w celu złagodzenia złego uwarunkowania polega na dodaniu grzbietu lub bryłki do przekątnej macierzy kowariancji. W przypadku regresji GP oznacza to dodanie (lub zwiększenie, jeśli już występuje) szumu obserwacyjnego.
Jak na razie dobrze. Zmodyfikowałem kod dla dokładnego wnioskowania o gpml , aby za każdym razem, gdy rozkład Cholesky'ego nie powiedzie się, staram się naprawić macierz kowariancji do najbliższej symetrycznej macierzy dodatniej określonej (SPD) w normie Frobenius, zainspirowanej tym kodem MATLAB autorstwa Johna d'Errico. Uzasadnieniem jest zminimalizowanie interwencji na oryginalnej matrycy.
To obejście spełnia swoje zadanie, ale zauważyłem, że wydajność BO znacznie się zmniejszyła dla niektórych funkcji - być może za każdym razem, gdy algorytm musiałby powiększyć w pewnym obszarze (np. Ponieważ zbliża się do minimum lub dlatego, że skala długości problemu stają się nierównomiernie małe). To zachowanie ma sens, ponieważ skutecznie zwiększam hałas, ilekroć dwa punkty wejściowe są zbyt blisko, ale oczywiście nie jest to idealne. Alternatywnie, mogłem po prostu usunąć problematyczne punkty, ale czasami czasami potrzebuję, aby punkty wejściowe były blisko.
Pytanie
Nie sądzę, że problemy numeryczne z rozkładem Cholesky'ego na macierze kowariancji GP to nowy problem, ale ku mojemu zaskoczeniu nie znalazłem do tej pory wielu rozwiązań, oprócz zwiększenia hałasu lub usunięcia punktów, które są zbyt blisko siebie. Z drugiej strony prawdą jest, że niektóre z moich funkcji są dość źle wykonywane, więc być może moja sytuacja nie jest tak typowa.
Wszelkie sugestie / referencje, które mogą być przydatne tutaj?