Ich habe ein Numpy-Array mit m Spalten und n Zeilen, wobei die Spalten Dimensionen und die Zeilendatenpunkte sind.
Ich muss jetzt Kernelwerte für jede Kombination von Datenpunkten berechnen.
Für einen linearen Kernel kann ich einfach tundot(X,X.T)
Wie kann ich effektiv alle Werte für den Gaußschen Kernel berechnen mit einem gegebenen s ?
python
kernel-trick
numpy
Peter Smit
quelle
quelle
Antworten:
Ich denke, das Hauptproblem besteht darin, die paarweisen Abstände effizient zu ermitteln. Sobald Sie das haben, ist der Rest elementweise.
Dazu möchten Sie wahrscheinlich scipy verwenden. Die Funktion
scipy.spatial.distance.pdist
macht das, was Sie brauchen, undscipy.spatial.distance.squareform
wird möglicherweise Ihr Leben erleichtern.Wenn Sie also die Kernel-Matrix möchten, tun Sie dies
Dokumentation finden Sie hier .
quelle
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
sehr einfach: Es ist nur eine C-implementierte Schleife, die Entfernungen auf offensichtliche Weise direkt berechnet , wobei die Schleife hier durchgeführt wird . Keine ausgefallene Vektorisierung oder irgendetwas anderes, was der Compiler automatisch erreichen kann.Als kleiner Nachtrag zu Bayerjs Antwort kann die
pdist
Funktion von scipy direkt euklidische Normen berechnen, indem sie als bezeichnet wirdpdist(X, 'sqeuclidean')
. Der vollständige Code kann dann effizienter geschrieben werden alsquelle
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
das gibt das gleiche.Sie können die quadratische Form auch von Hand schreiben:
PS, aber das funktioniert 30% langsamer
quelle
einsum
Anruf für SieX2
.das ist gleich
Sie können den RBF effektiv aus dem obigen Code berechnen. Beachten Sie, dass der Gammawert 1 ist, da es sich um eine Konstante handelt. Das von Ihnen angeforderte s ist ebenfalls dieselbe Konstante.
quelle
Ich denke, das wird helfen:
quelle