Jak jądro prostego perceptronu?


10

Problemy klasyfikacyjne z nieliniowymi granicami nie mogą być rozwiązane przez prosty perceptron . Poniższy kod R służy do celów ilustracyjnych i jest oparty na tym przykładzie w języku Python):

nonlin <- function(x, deriv = F) {
  if (deriv) x*(1-x)
  else 1/(1+exp(-x))
}

X <- matrix(c(-3,1,
              -2,1,
              -1,1,
               0,1,
               1,1,
               2,1,
               3,1), ncol=2, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(2,-1,1)

for (iter in 1:100000) {
  l1 <- nonlin(X %*% syn0)
  l1_error <- y - l1
  l1_delta <- l1_error * nonlin(l1,T)
  syn0 <- syn0 + t(X) %*% l1_delta
}

print("Output After Training:")
## [1] "Output After Training:"
round(l1,3)
##       [,1]
## [1,] 0.488
## [2,] 0.468
## [3,] 0.449
## [4,] 0.429
## [5,] 0.410
## [6,] 0.391
## [7,] 0.373

Teraz idea jądra i tak zwanej sztuczki jądra polega na rzutowaniu przestrzeni wejściowej na przestrzeń o wyższym wymiarze, taką jak ( źródła zdjęć ):

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Moje pytanie
Jak korzystać ze sztuczki jądra (np. Z prostym jądrem kwadratowym), aby uzyskać perceptron jądra , który jest w stanie rozwiązać dany problem z klasyfikacją? Uwaga: Jest to głównie pytanie koncepcyjne, ale gdybyś mógł także podać niezbędną modyfikację kodu, byłoby świetnie

To, co próbowałem do tej pory
, wypróbowałem następujące, które działa dobrze, ale myślę, że to nie jest prawdziwa okazja, ponieważ staje się zbyt drogie obliczeniowo w przypadku bardziej skomplikowanych problemów („sztuczka” za „sztuczką z jądrem” to nie tylko idea samo jądro, ale nie musisz obliczać projekcji dla wszystkich instancji):

X <- matrix(c(-3,9,1,
              -2,4,1,
              -1,1,1,
               0,0,1,
               1,1,1,
               2,4,1,
               3,9,1), ncol=3, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(3,-1,1)

Pełne ujawnienie
Zamieściłem to pytanie tydzień temu na SO, ale nie zyskało ono dużej uwagi. Podejrzewam, że jest to lepsze miejsce, ponieważ jest bardziej pytaniem koncepcyjnym niż programowym.

Odpowiedzi:


2

XX=X,X<,>:Rp×RpRk:Rp×RpR

K.(xja,xjot)=exp(-||xja-xjot||2)2)σ2))

Jak wspomniano na stronie Wikipedii na temat perceptronu jądra , wybieramy podzbiór wielkości danych wejściowych i używamy ich liniowej kombinacji, aby uzyskać nasz wynik, M.

fa(x)=jaM.αjayjaK.(x,xja)

Jeśli widziałeś maszynę wektorów wsparcia ( SVM ), zauważysz identyczny dual. Aby wybrać podzbiór rozmiaru do użycia, optymalizujemy ponad , które reprezentują, czy próbka jest wektorem wspierającym / naszego rozwiązania. W optymalizacji uwzględniamy wagi oryginalnej optymalizacji perceptronu.α i i α i ω iM.αjajaαjaωja

Jeśli chodzi o twoje pytanie o konieczności obliczania rzutu, masz rację, twoja macierz danych wejściowych jest nadal dwuwymiarowa. W obliczeniach danych wyjściowych zastąpiliśmy iloczyn skalarny funkcją jądra i w tym miejscu następuje obliczenie „niejawne” w przestrzeni cech.X



Dziękujemy - czy możesz uściślić swoją odpowiedź w tym sensie, że określasz, które wiersze w powyższym kodzie należy zmodyfikować w jaki sposób? Jeśli nie znasz R, modyfikacje można oczywiście podać w pseudokodzie. Z radością przyjąłbym twoją odpowiedź :-)
vonjd

Wpis, do którego linkujesz, na którym opierasz swój kod, jest, moim zdaniem, słabą prezentacją perceptronów i propagacji wstecznej, choć z pewnością jest zwięzły. Czy wiesz, jak działa propagacja wsteczna i ogólna teoria perceptronów?
Kellan Fluette,

Do pewnego stopnia mam nadzieję. O co ci dokładnie chodzi? Jak zmodyfikowałbyś powyższy kod, aby użyć sztuczki jądra z jądrem kwadratowym?
vonjd

Czy nie ma $ \ vec {x} ^ \ intercal \ vec {x) $ w podwójnym Lagrangianu kryterium percepcji? To właśnie tutaj zamieniasz wewnętrzny produkt na ocenę funkcji jądra.
Kellan Fluette,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.