Saya memiliki array numpy dengan kolom m dan n baris, kolom menjadi dimensi dan baris datapoints.
Sekarang saya perlu menghitung nilai kernel untuk setiap kombinasi titik data.
Untuk kernel linear bisa saya lakukandot(X,X.T)
Bagaimana saya bisa menghitung secara efektif semua nilai untuk Gaussian Kernel dengan nilai s ?
python
kernel-trick
numpy
Peter Smit
sumber
sumber
Jawaban:
Saya pikir masalah utama adalah untuk mendapatkan jarak berpasangan secara efisien. Setelah Anda memiliki sisanya adalah elemen bijaksana.
Untuk melakukan ini, Anda mungkin ingin menggunakan Scipy. Fungsi
scipy.spatial.distance.pdist
melakukan apa yang Anda butuhkan, danscipy.spatial.distance.squareform
mungkin akan memudahkan hidup Anda.Jadi jika Anda ingin matriks kernel yang Anda lakukan
Dokumentasi dapat ditemukan di sini .
sumber
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
sangat sederhana: itu hanya loop C-diimplementasikan yang secara langsung menghitung jarak dengan cara yang jelas , looping dilakukan di sini ; tidak ada vektorisasi mewah atau apa pun di luar apa pun yang dapat dicapai kompilator secara otomatis.Sebagai tambahan kecil untuk jawaban bayerj,
pdist
fungsi scipy dapat secara langsung menghitung norma euclidean kuadrat dengan menyebutnya sebagaipdist(X, 'sqeuclidean')
. Kode lengkap kemudian dapat ditulis lebih efisien sebagaisumber
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
yang memberikan hal yang sama.Anda juga dapat menulis formulir persegi dengan tangan:
PS tapi ini bekerja 30% lebih lambat
sumber
einsum
panggilan untuk AndaX2
.yang sama dengan
Anda dapat secara efektif menghitung RBF dari catatan kode di atas bahwa nilai gamma adalah 1, karena itu adalah konstanta yang Anda minta juga konstan yang sama.
sumber
Saya pikir ini akan membantu:
sumber