Creo que el problema principal es obtener las distancias por pares de manera eficiente. Una vez que tienes eso, el resto es elemento sabio.
Para hacer esto, probablemente quieras usar scipy. La función scipy.spatial.distance.pdisthace lo que necesita y scipy.spatial.distance.squareformposiblemente le facilitará la vida.
Entonces, si quieres la matriz del núcleo, haz
from scipy.spatial.distance import pdist, squareform
# this is an NxD matrix, where N is number of items and D its dimensionalites
X = loaddata()
pairwise_dists = squareform(pdist(X, 'euclidean'))
K = scip.exp(-pairwise_dists ** 2 / s ** 2)
La documentación se puede encontrar aquí .