Temukan pasangan dekat dalam ruang dimensi sangat tinggi dengan vektor jarang

9

Saya memiliki vektor fitur (~ sejuta). Ada fitur biner (~ sejuta), tetapi dalam setiap vektor hanya (~ seribu) dari mereka akan menjadi , sisanya adalah . Saya mencari pasangan vektor yang memiliki setidaknya (~ seratus) fitur yang sama ( di keduanya). Jumlah pasangan demikian besarnya sama dengan (~ satu juta).M K 1 0 L 1 NNMK10L1N

Saya pikir ini bisa didekati sebagai mencari pasangan titik dekat dalam ruang dimensi yang sangat tinggi. Fungsi jarak bisa sedemikian rupa sehingga didasarkan pada berapa banyak fitur yang dimiliki oleh kedua vektor tersebut. Tetapi mungkin akan berguna dengan metrik jarak yang lebih konvensional (seperti Euclidean) juga.

Algoritma terkenal mana yang akan berguna untuk mendekati masalah ini? Apa pun yang kuadratik dalam atau tidak akan praktis.M.NM


Contoh perumusan masalah dunia nyata adalah untuk mempertimbangkan orang bergerak di antara sejumlah lokasi. Jika dua orang berada di lokasi yang sama pada saat yang sama, kami katakan mereka bertemu satu sama lain. (Jumlah kombinasi waktu-lokasi dengan setidaknya 1 orang hadir adalah ) Kami mencari teman: orang yang bertemu setidaknya kali.M LNML

Daniel Darabos
sumber
1
Jika vektor 1, fitur 1 adalah , & vektor 2, fitur 1 juga , apakah mereka memiliki fitur "sama"? 000
gung - Reinstate Monica
@ user777, saya anggap tidak , dalam hal ini jawaban Anda sempurna, tetapi akan lebih baik untuk ini secara eksplisit dinyatakan oleh OP.
gung - Reinstate Monica
@ung, kamu anggap benar. Saya telah mengedit pertanyaan untuk diklarifikasi. Terima kasih!
Daniel Darabos
1
Tentang berapa banyak pasangan vektor memiliki> 100 fitur yang sama - sampel acak + gaya kasar? Apakah ukuran 1M x 1M adalah masalah nyata, atau dibuat-buat? Lihat juga pendekatan dalam pencarian bit-string-terdekat-tetangga di stackoverflow.
denis
1
Saran yang mungkin gila: lihat vektor fitur 1 Mbit panjang Anda sebagai gambar 1000 x 1000 piksel, dan cari metode untuk pengelompokan gambar, misalnya stackoverflow.com/search?q=[image[+clustering . Afaik Anda harus menemukan fitur yang bagus (bukan satu piksel) untuk itu berfungsi, tapi saya bukan ahli.
denis

Jawaban:

6

Sepertinya pendekatan yang Anda cari adalah kombinasi tanda tangan minhash dan Locality Sensitive Hashing (LSH); pdf dari Kumpulan Data Penambangan Masif menjelaskan pendekatan ini (dan langkah-langkah kesamaan lainnya) dalam beberapa detail di Bab 3, tetapi secara singkat:

Sebuah tanda tangan minhash adalah representasi kental matriks asli Anda yang dibangun dengan menerapkan beberapa nomor n fungsi hash untuk fitur, sehingga mengurangi jumlah fitur per observasi. Ini mengurangi ukuran data Anda, namun Anda mungkin akan memperhatikan bahwa ini masih menyisakan masalah .O(N2)

Untuk mengatasinya, MMDS menyarankan bahwa jika semua yang ingin Anda temukan adalah pasangan di atas ambang batas kemiripan tertentu (yang tampaknya berlaku dalam kasus Anda), maka Anda hanya dapat fokus pada pasangan yang paling mungkin serupa - pendekatan ini disebut Locality Sensitive Hashing , dan di bagian 3.4 mereka membahas contoh cara menggabungkan pendekatan tanda tangan minhash dengan LSH.

Selain teks, ada juga kuliah yang tersedia di kursus Coursera dengan nama yang sama.

Tchotchke
sumber
7

Saya mencari pasangan vektor yang memiliki setidaknya fitur sama.L

Ini hanya produk dalam dari vektor fitur biner. Ketika produk dalam lebih besar dari , pasangan akan memiliki setidaknya elemen yang sama. Ini harus menjadi perhitungan yang relatif cepat - setidaknya, lebih cepat dari jarak euclidean, yang akan sia-sia dan lambat untuk data ini. Karena Anda menetapkan bahwa Anda sedang mencari pasangan, ini akan inheren berarti Anda harus melakukan perhitungan untuk membandingkan setiap vektor.LL1L(N2)

Menemukan poin yang berdekatan memang merupakan masalah pengelompokan. Tetapi langkah pertama dari algoritma pengelompokan yang saya kenal adalah menghitung jarak berpasangan atau kesamaan. Saya yakin seseorang telah mengembangkan alternatif yang lebih efisien. Poin tentang terminologi: memiliki setidaknya tetangga yang sama diucapkan sebagai kesamaan , bukan jarak! Produk dalam, dalam hal ini, adalah persamaan cosinus yang tidak dinormalisasi.L

Anda dapat membuat ini lebih mudah ditelusuri dengan hanya melakukan perhitungan produk dalam ketika jumlah vektor fitur (yang dalam hal ini sama dengan norma) untuk pengamatan lebih besar daripada , karena tidak mungkin untuk vektor fitur biner itu untuk memiliki produk batin dengan vektor fitur biner lain yang akan memenuhi kriteria saya ketika jumlah ini kurang dari . Jelas, menghitung jumlah ini hanya kompleksitas , jadi saya adalah cara yang murah untuk menurunkan besarnya langkah produk dalam.L O ( N )L1LO(N)

Tetapi cara klasik untuk mengurangi ruang lingkup masalah ini adalah dengan melakukan pra-filtering tambahan. Apakah Anda terutama tertarik ketika satu, fitur yang agak tidak biasa mengambil nilai 1? Jika demikian, hanya lakukan penghitungan untuk vektor fitur tersebut.

Atau mungkin Anda bisa mendapat manfaat dari membingkai ulang masalah Anda. Sebagai contoh, pengambilan sampel diketahui memiliki sifat yang bagus; statistik inferensial berkembang pada gagasan ini hingga cukup mendalam. Jadi mungkin tidak mungkin untuk menganalisis seluruh kumpulan data, tetapi sangat layak untuk memeriksa sampel kecil. Saya tidak tahu pertanyaan apa yang Anda coba jawab, tetapi jika Anda dengan hati-hati merancang eksperimen Anda, Anda dapat pergi hanya dengan melihat beberapa ribu pengamatan, dengan lebih dari cukup data yang tersisa untuk keperluan validasi.

Setelah beberapa pemikiran tambahan, saya punya firasat kuat bahwa data Anda bekerja dengan beberapa jenis graf . Sangat masuk akal bahwa terdiri dari beberapa komponen yang terhubung, dalam hal ini Anda dapat menguraikan menjadi satu set grafik, dengan efek samping yang menyenangkan dari mengurangi dimensi data. Bahkan jika grafik hanya dua komponen yang terhubung dengan ukuran yang hampir sama, itu berarti perbandingan berpasangan memiliki kira-kira total biaya!G G O ( N 2 ) 1GGGO(N2)14

Jika grafiknya simetris, pengamatan berikut mungkin bermanfaat:

  1. Tentukan Laplacian grafik Anda sebagai , di mana adalah matriks derajat diagonal (jumlah setiap vektor fitur) dan adalah matriks adjacency (penumpukan vektor fitur ke dalam matriks).D AP=DADA
  2. Jumlah kali muncul sebagai nilai eigen dari adalah jumlah komponen yang terhubung dari . Menguraikan grafik menjadi komponen-komponen yang terhubung dan bekerja hanya dengan komponen-komponen itu akan memiliki efek samping mengurangi dimensi data Anda; menghitung jumlah minat Anda akan lebih mudah. Tetapi menghitung komposisi eigend akan mahal untuk satu juta simpul ...P G0PG
  3. (Setelah permutasi penuh) adalah matriks diagonal blok Laplacians komponen terhubung dari .GPG
  4. P adalah semidefinit positif. Ini hampir pasti bermanfaat entah bagaimana.
  5. Konektivitas aljabar dari adalah nilai eigen kedua terkecil . Ini memberitahu Anda seberapa baik terhubung . Mungkin itu akan menjawab beberapa pertanyaan yang Anda minati: vektor yang memiliki fitur yang sama. Teori grafik spektral mengembangkan gagasan ini secara lebih rinci.P GGPG

"Apakah ini masalah SNA?" Saya tidak yakin. Dalam satu aplikasi fitur menggambarkan perilaku dan kami ingin menghubungkan orang dengan perilaku serupa. Apakah itu menjadikan ini masalah SNA?

Jika Anda memiliki grafik bipartit yang menghubungkan orang dengan perilaku, Anda dapat menganggap ini sebagai jaringan afiliasi , dengan orang-orang sebagai baris dan perilaku sebagai kolom. Jika Anda ingin menghubungkan orang ke orang lain melalui perilaku mereka memiliki kesamaan, Anda dapat menghitung . adalah jumlah perilaku yang dimiliki orang-orang. Jelas, himpunan simpul di mana menjawab pertanyaan Anda.B B T = A A i j A i jLBBBT=AAijAijL

Sycorax berkata Reinstate Monica
sumber
Terima kasih atas jawaban yang bagus! Itu banyak hal yang harus saya selidiki lebih lanjut. Saya tidak yakin perbandingan berpasangan tidak dapat dihindari. Bukankah ini masalah pengelompokan di mana saya mencari kelompok ukuran> 1? Saya mengharapkan beberapa pendekatan partisi spasial dapat sangat mengurangi jumlah perbandingan berpasangan.
Daniel Darabos
Maaf, saya tidak tahu banyak tentang ilmu data. Tapi bukankah itu masalah pengelompokan ketika kita mencari untuk mengelompokkan poin-poin yang saling berdekatan? Saya memiliki jarak maksimum (L) dan ingin menemukan kelompok (pasangan) dari titik-titik yang terletak dalam jarak satu sama lain. Apakah itu terlalu memperluas definisi pengelompokan?
Daniel Darabos
1
Itu memang bisa diutarakan sebagai masalah grafik. Dalam hal ini kami memiliki grafik bipartit dari titik N dan fitur M dan ingin menemukan pasangan titik yang memiliki setidaknya L tetangga yang sama. Saya secara khusus melihat fitur berbasis vektor sekarang, berharap ada metode pengelompokan yang dapat berguna bagi saya. K-SVD disarankan untuk masalah serupa di stats.stackexchange.com/questions/93366/… , jadi saya membaca tentang itu saat ini. Terima kasih!
Daniel Darabos
"Apakah ini masalah SNA?" Saya tidak yakin. Dalam satu aplikasi fitur menggambarkan perilaku dan kami ingin menghubungkan orang dengan perilaku serupa. Apakah itu menjadikan ini masalah SNA? Terima kasih telah memperkenalkan saya pada terminologi, sangat membantu untuk memandu pencarian saya.
Daniel Darabos
Saya telah merevisi jawaban saya. Apakah tujuan akhir Anda hanya untuk menghitung orang-orang dengan banyak perilaku yang sama, atau apakah itu sesuatu yang lain?
Sycorax berkata Reinstate Monica
2

Saat mencari orang yang bertemu di blok ruang-waktu:
pisah ruang menjadi blok (blok kota, km persegi, apa pun), dan waktu menjadi blok . Ada peluang bagus bahwa jika orang bertemu, mereka akan bertemu dalam blok yang sama. Jadi jalankan NN dalam setiap blok. Runtime dan tingkat kesalahan tentu saja akan tergantung pada ukuran dan bentuk blok (juga pada apa yang dapat Anda paralelkan / MapReduce), tetapi Anda memiliki parameter untuk dimainkan - teknik, bukan terbuka lebar .N t i m e O ( N 2 )NspaceNtime
O(N2)

Lihat juga:
tetangga-tetangga-cari-data-sangat-tinggi-dimensi pada datacience.stackexchange

pairwise.py :

menggunakan pustaka Python Gensim dan heapq dari pustaka standar untuk membuat perbandingan berpasangan secara cepat dan terukur besar-besaran antara sejumlah besar dokumen dengan menggunakan TF-IDF dan jarak cosinus.

denis
sumber
1

Kamus terbalik! titik sebagai , kunci yang terkait dengan nilai-nilai yang tidak nol (yaitu fitur yang dianggap benar). Ukuran rata-rata penyimpanan elemen akan . Memang, saya hanya perlu string untuk menyimpan fitur dan mengapung untuk memegang nilai-nilai.f e a t 1 : v a l u e 1 , f e a t 101 : v a l u e 101 K K Kxfeat1:value1,feat101:value101KKK

Untuk setiap fitur, buat kamus yang berisi indeks yang membagikan fitur ini. Semoga angka ini tidak terlalu besar (jika Anda memiliki fitur yang dibagikan oleh semua indeks, pendekatan ini hancur, Anda dapat berhenti membaca di sini).

Kamus ini terlihat seperti: . Jika saya ingin mendapatkan kecepatan dan menghemat ruang, saya bahkan dapat menjatuhkan fitur yang hanya ditemukan dengan satu elemen (di sini: ) karena mereka tidak akan menghasilkan pasangan yang dekat. Kamus ini dibangun dalam operasi .feat1:{1,101,202},feat2:{7,202},feat3:{202}...featM:{3,45,6}feat3O(NK)

Sekarang, ketika Anda ingin mengevaluasi jarak elemen ke yang lain, buat (dengan kamus) daftar indeks yang membagikan setidaknya satu fitur dengan . Anda tahu bahwa semua elemen lainnya jauh dari (mereka bahkan tidak berbagi satu fitur!). Jika jumlah rata-rata "elemen per fitur" rendah (sebut saja ), Anda tidak perlu lagi menggunakan .x x P O ( N 2 )xxxPO(N2)

Sekarang ada perbaikan besar lainnya jika dan juga diwakili sebagai kamus, karena atau dapat dievaluasi iterasi dengan kunci dan , dalam operasi .y d ( x , y ) < x , y > x y O ( K )xyd(x,y)<x,y>xyO(K)

Kompleksitas akhir Anda adalah bukan pendekatan awal naif .O ( M N 2 )O(NPK)O(MN2)

Saya menerapkan metode ini untuk menerapkan KNN pada set teks besar (kereta: 2.000 baris, menguji 35.000 baris, jumlah fitur: 10.000, jumlah rata-rata fitur per elemen: 20), yang berjalan sekitar satu jam .. .

RUser4512
sumber
Saya tidak sepenuhnya memahami pendekatan ini - ini bukan karena saya tidak mempercayai Anda, itu sepenuhnya karena kurangnya keakraban saya dengan berbagai strategi untuk merepresentasikan data. Mungkin Anda bisa menguraikan lebih lanjut tentang apa yang Anda liput dalam dua paragraf pertama?
Sycorax berkata Reinstate Monica
1) "angka ini tidak akan terlalu besar": jumlah kolom rata-rata = jumlah baris rata-rata = 1000. 2) mengapung? fitur OP adalah biner 3) runtimes untuk 3 run N, 2N, 4N akan menarik, akan menunjukkan jika mereka kira-kira . O(N2)
denis
1

Saya telah menemukan referensi yang mungkin Anda temukan bermanfaat, dan saya percaya itu asimptotik lebih efisien daripada setiap solusi lain yang disajikan sejauh ini. Jika saya mengerti dengan benar, Anda dapat membuat grafik -nearest neighbor (KNN) dalam waktu .O ( L N log ( N ) )kO(LNlog(N))

L. Erotz, M. Steinbach, dan V. Kumar. "Algoritma pengelompokan tetangga terdekat baru yang dibagikan dan aplikasinya." Prosiding Lokakarya Pertama tentang Pengelompokan Data Dimensi Tinggi dan Penerapannya, 2002.

Sycorax berkata Reinstate Monica
sumber
Terima kasih, ini bacaan yang menarik. Bagaimana Anda mendapatkan waktu O (LN log (N))? Kedengarannya bagus. Tetapi deskripsi algoritma dimulai dengan "Membangun matriks kesamaan" dan itu akan menjadi matriks NxN sejauh yang saya mengerti.
Daniel Darabos
@DanielDarabos Kompleksitas dijelaskan dalam buku Praktis Grafik Mining dengan R.
Sycorax mengatakan Reinstate Monica
1

O(klogn)k<<n

Mengingat bahwa k Anda adalah 100 dan n Anda adalah 1e6, ini akan memberi Anda ~ 1e4x lebih cepat dibandingkan dengan FFT klasik.

Jika Anda membutuhkan kecepatan 20x lain, dan Anda adalah pengambil risiko, maka alih-alih membelit semua baris terhadap domain dan mencari puncaknya, Anda dapat mem-bootstrap subset baris.

Anda mungkin juga memfilter kolom dengan menghapus kolom yang jumlahnya di bawah 50, atau beberapa ambang batas lainnya yang ada di urutan setengah jumlah baris yang ingin Anda cocokkan. Paling tidak Anda harus menghapus kolom semua nol dan semua 1 sebagai non-informatif. Sama dengan baris yang sepenuhnya kosong atau cukup kosong, atau baris yang penuh sehingga tidak relevan.

Agenda: Saya harus memberi contoh di sini menggunakan data sintetis, dan membandingkan beberapa metode.

EngrStudent
sumber
0

Saya baru saja menemukan kertas yang secara langsung relevan.

Algoritma acak dan NLP: menggunakan fungsi hash sensitifitas lokalitas untuk kluster kata benda berkecepatan tinggi (Ravichandran et al, 2005)

Ini sebenarnya diimplementasikan di https://github.com/soundcloud/cosine-lsh-join-spark yang merupakan tempat saya menemukannya.

Ini didasarkan pada hashing sensitif lokalitas (sudah disebutkan dalam jawaban lain). Setelah mengurangi fitur vektor ke ruang dimensi rendah, ia menggunakan gabungan Hamming distance cepat untuk menemukan tetangga terdekat.

Daniel Darabos
sumber