Tengo una matriz numpy con m columnas yn filas, siendo las columnas dimensiones y los puntos de datos de las filas.
Ahora necesito calcular los valores del núcleo para cada combinación de puntos de datos.
Para una lineal del núcleo puedo simplemente hacerdot(X,X.T)
python
kernel-trick
numpy
Peter Smit
fuente
fuente
Respuestas:
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 yscipy.spatial.distance.squareform
posiblemente le facilitará la vida.Entonces, si quieres la matriz del núcleo, haz
La documentación se puede encontrar aquí .
fuente
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
es muy simple: es solo un bucle implementado en C que calcula directamente las distancias de la manera obvia , el bucle se realiza aquí ; no hay vectorización sofisticada ni nada más allá de lo que el compilador pueda lograr automáticamente.Como una pequeña adición a la respuesta de bayerj, la
pdist
función de scipy puede calcular directamente las normas euclidianas cuadráticas llamándolas comopdist(X, 'sqeuclidean')
. El código completo se puede escribir de manera más eficiente comofuente
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
que da lo mismo.También puedes escribir forma cuadrada a mano:
PD pero esto funciona un 30% más lento
fuente
einsum
llamada para suX2
.que es igual a
Puede calcular efectivamente el RBF a partir de la nota del código anterior que indica que el valor gamma es 1, ya que es una constante, la que solicitó también es la misma constante.
fuente
Creo que esto ayudará:
fuente