Mam tablicy numpy z m kolumn i n wierszy, kolumn i wymiarach będących rzędów punktów danych.
Teraz muszę obliczyć wartości jądra dla każdej kombinacji punktów danych.
Dla liniowego jądra mogę po prostu zrobićdot(X,X.T)
Jak mogę skutecznie obliczyć wszystkie wartości dla jądra Gaussa z podanym s ?
python
kernel-trick
numpy
Peter Smit
źródło
źródło
Odpowiedzi:
Myślę, że głównym problemem jest efektywne uzyskanie odległości parami. Gdy już to zrobisz, reszta jest mądra.
Aby to zrobić, prawdopodobnie chcesz użyć scipy. Ta funkcja
scipy.spatial.distance.pdist
spełniascipy.spatial.distance.squareform
Twoje oczekiwania i prawdopodobnie ułatwi Ci życie.Więc jeśli chcesz macierz jądra, to robisz
Dokumentacja znajduje się tutaj .
źródło
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
jest bardzo prosty: jest to po prostu pętla zaimplementowana w języku C, która bezpośrednio oblicza odległości w oczywisty sposób , przy czym pętla jest wykonywana tutaj ; żadna fantazyjna wektoryzacja ani nic poza tym, co kompilator może wykonać automatycznie.Jako niewielki dodatek do odpowiedzi Bayerja,
pdist
funkcja Scipy'ego może bezpośrednio obliczyć kwadratowe normy euklidesowe, nazywając topdist(X, 'sqeuclidean')
. Pełny kod można następnie zapisać bardziej efektywnie jakoźródło
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
co daje to samo.Możesz również ręcznie napisać kwadratowy formularz:
PS, ale działa to o 30% wolniej
źródło
einsum
wezwanie Dla PaństwaX2
.co jest równe
Możesz skutecznie obliczyć RBF na podstawie powyższego kodu, że wartość gamma wynosi 1, ponieważ jest to stała, o którą prosiłeś, jest również taka sama.
źródło
Myślę, że to pomoże:
źródło