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.pdist
hace lo que necesita y scipy.spatial.distance.squareform
posiblemente 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í .