Eu tenho uma matriz numpy com m colunas en linhas, as colunas sendo dimensões e os pontos de dados de linhas.
Agora preciso calcular os valores do kernel para cada combinação de pontos de dados.
Para uma linear do kernel eu posso simplesmente fazerdot(X,X.T)
python
kernel-trick
numpy
Peter Smit
fonte
fonte
Respostas:
Penso que o principal problema é obter as distâncias aos pares de forma eficiente. Depois de ter que o resto é elemento sábio.
Para fazer isso, você provavelmente deseja usar o scipy. A função
scipy.spatial.distance.pdist
faz o que você precisa escipy.spatial.distance.squareform
possivelmente facilitará sua vida.Então, se você quiser a matriz do kernel, faça
A documentação pode ser encontrada aqui .
fonte
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
é muito simples: é apenas um loop implementado em C que calcula diretamente as distâncias da maneira óbvia , o loop sendo feito aqui ; nenhuma vetorização sofisticada ou qualquer coisa além do que o compilador pode realizar automaticamente.Como um pequeno adendo à resposta de bayerj, a
pdist
função de scipy pode calcular diretamente as normas euclidianas ao quadrado, chamando-a depdist(X, 'sqeuclidean')
. O código completo pode ser escrito de forma mais eficiente comofonte
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
que dá o mesmo.Você também pode escrever um formulário quadrado à mão:
PS, mas isso funciona 30% mais lento
fonte
einsum
chamada para o seuX2
.que é igual a
Você pode calcular efetivamente o RBF a partir do código acima, observe que o valor gama é 1, pois é uma constante as s solicitadas também são a mesma constante.
fonte
Eu acho que isso ajudará:
fonte