Evaluasi efisien estimasi kepadatan kernel multidimensi

9

Saya telah melihat sejumlah literatur yang masuk akal tentang bagaimana memilih kernel dan bandwidth ketika menghitung estimasi kepadatan kernel, tetapi saya saat ini tertarik pada bagaimana meningkatkan waktu yang diperlukan untuk mengevaluasi KDE yang dihasilkan pada jumlah titik yang berubah-ubah.

Dalam kasus saya, saya menggunakan kernel Gaussian multidimensi (2D atau 3D) dengan kovarians diagonal (yaitu masing-masing dimensi independen). Bandwidth di setiap dimensi mungkin berbeda dan dipilih menggunakan tetangga terdekat. Namun, pertanyaan saya mungkin meluas ke kernel yang berbeda dan metode pemilihan bandwidth.

Katakanlah saya memiliki poin data dan ingin mengevaluasi KDE yang dihasilkan di titik-titik grid. Implementasi sederhana melibatkan mengevaluasi multivariat normal pdf kali. Untuk tujuan saya, dan berada di urutan ribuan, dan evaluasi telah menjadi hambatan dalam kode saya.MNMNMN

Saya tidak mengetahui apakah ada perbaikan yang diterima secara umum untuk metode dasar ini. Saya menemukan makalah ini , yang mengklaim mengurangi kompleksitas dari ke . Namun, metode ini belum diimplementasikan dalam pustaka R atau Python 'standar' yang saya ketahui - yang menunjukkan bahwa itu belum diadopsi secara luas?O(MN)O(M+N)

Terima kasih atas petunjuk yang dapat Anda berikan.

Gabriel
sumber

Jawaban:

12

Saya akan memberikan jawaban (tidak lengkap) di sini jika itu membantu orang lain keluar.

  1. Ada beberapa metode matematika terbaru untuk menghitung KDE secara lebih efisien. Salah satunya adalah Fast Gauss Transform, yang diterbitkan dalam beberapa studi termasuk yang ini . Cara lain adalah menggunakan pendekatan berbasis pohon (pohon KD atau ball tree) untuk menentukan sumber mana yang berkontribusi pada titik kisi tertentu. Tidak jelas apakah ini telah diterbitkan, tetapi diimplementasikan dalam Scikit-belajar dan berdasarkan metode yang dikembangkan oleh Jake Vanderplas .
  2. Jika metode ini sedikit fiddly, mungkin untuk menulis sesuatu yang sedikit lebih mendasar yang mencapai tugas yang sama. Saya mencoba membangun berbentuk kubus di sekitar setiap titik grid, dengan panjang sisi yang terkait dengan bandwidth di masing-masing dimensi tersebut. Ini tidak memungkinkan kontrol besar kesalahan, meskipun itu memberi Anda beberapa kecepatan.
  3. Akhirnya, komputasi KDE cukup mudah diparalelkan, baik pada beberapa inti CPU atau pada GPU. Saya sedang mempertimbangkan untuk mengimplementasikan KDE di CUDA, tetapi belum melakukannya.
Gabriel
sumber
Oh, dan saya tidak berarti mengemis ... tapi jika seseorang bisa menyenangkan upvote ini sehingga saya akhirnya bisa membebaskan diri dari keterbatasan yang dikenakan pada pendatang baru, yang akan sangat dihargai :)
Gabriel