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?
Odpowiedzi:
Inną opcją jest zasadniczo uśrednienie punktów powodujących - na przykład, jeśli masz 1000 punktów i 50 powoduje problemy, możesz wziąć optymalne przybliżenie niskiej rangi za pomocą pierwszych 950 wartości własnych / wektorów. Nie jest to jednak dalekie od usuwania punktów danych blisko siebie, co, jak powiedziałeś, wolisz nie robić. Pamiętaj jednak, że dodając jitter zmniejszasz stopnie swobody - tzn. Każdy punkt ma mniejszy wpływ na twoje prognozy, więc może być gorzej niż przy użyciu mniejszej liczby punktów.
Edytować:
Na podstawie komentarzy pomyślałem, że rozwinę to, co miałem na myśli, włączając w to obserwacje pochodne. Jeśli użyjemy jądra gaussowskiego (jako przykładu),
jego pochodne są,
Reszta GP jest taka sama jak zwykle.
źródło
Jednym z rozwiązań, które wykopaliśmy w biurze, jest zmiana kłopotliwych punktów. Może to przybierać formę prostego usuwania lub czegoś bardziej wyrafinowanego. Zasadniczo, obserwacja jest taka, że punkty pobliskie są wysoce zbędne: w rzeczywistości tak zbędne, że zmniejszają rangę macierzy kowariancji. Z tego samego powodu, jeden punkt i tak wnosi niewiele informacji do danego problemu, więc usunięcie jednego lub drugiego (lub zrobienie czegoś innego, na przykład uśrednienie ich lub „odbicie” jednego punktu od drugiego na minimalną akceptowalną odległość) tak naprawdę wcale nie zmieniaj swojego rozwiązania.
Nie jestem pewien, jak ocenić, w którym momencie dwa punkty stają się „zbyt blisko”. Być może może to być opcja tuningu pozostawiona użytkownikowi.
(Ups! Po tym, jak to opublikowałem, znalazłem tutaj twoje pytanie, które przesuwa tę odpowiedź do znacznie bardziej skomplikowanego rozwiązania. Mam nadzieję, że łącząc się z nią z mojej odpowiedzi, pomogę w SEO ...)
źródło