J'ai un tableau numpy avec m colonnes et n lignes, les colonnes étant des dimensions et les points de données des lignes.
Je dois maintenant calculer les valeurs du noyau pour chaque combinaison de points de données.
Pour un noyau linéaire je peux simplement fairedot(X,X.T)
python
kernel-trick
numpy
Peter Smit
la source
la source
Réponses:
Je pense que le principal problème est d'obtenir efficacement les distances par paires. Une fois que vous avez que le reste est élémentaire.
Pour ce faire, vous voudrez probablement utiliser scipy. La fonction
scipy.spatial.distance.pdist
fait ce dont vous avez besoin etscipy.spatial.distance.squareform
peut vous faciliter la vie.Donc, si vous voulez la matrice du noyau que vous faites
La documentation peut être trouvée ici .
la source
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
est très simple: c'est juste une boucle implémentée en C qui calcule directement les distances de manière évidente , le bouclage se faisant ici ; aucune vectorisation sophistiquée ou quoi que ce soit au-delà de ce que le compilateur peut accomplir automatiquement.Comme un petit addendum à la réponse de bayerj, la
pdist
fonction de scipy peut directement calculer les normes euclidiennes au carré en l'appelant commepdist(X, 'sqeuclidean')
. Le code complet peut ensuite être écrit plus efficacementla source
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
ce qui donne la même chose.Vous pouvez également écrire la forme carrée à la main:
PS mais cela fonctionne 30% plus lentement
la source
einsum
appel pour vousX2
.ce qui est égal à
Vous pouvez calculer efficacement le RBF à partir du code ci-dessus, notez que la valeur gamma est 1, car il s'agit d'une constante, le s que vous avez demandé est également la même constante.
la source
Je pense que ça aidera:
la source