Yüksek boyutlu verilerde en yakın komşular?


163

Birkaç gün önce belirli bir vektör için en yakın komşuları nasıl bulacağım hakkında bir soru sordum . Benim vektörüm şimdi 21 boyut ve daha ileri gitmeden önce, çünkü Makine Öğrenimi ne de Matematik alanından değilim, kendime bazı temel sorular sormaya başlıyorum:

  • Öklid mesafesi en yakın komşuları bulmak için iyi bir ölçüm mü? Değilse, seçeneklerim nelerdir?
  • Ek olarak, k-komşularını belirlemek için doğru eşiği nasıl belirleyeceğiz? Bu değeri anlamak için yapılabilecek bazı analizler var mı?
  • Daha önce, kd-Ağaçları kullanmam öneriliyordu, ancak Wikipedia sayfası açıkça yüksek boyutlar için kd-Tree'nin neredeyse bir kaba kuvvet aramasına eşdeğer olduğunu söylüyor. Bu durumda, bir milyon nokta veri kümesinde en yakın komşuları verimli bir şekilde bulmanın en iyi yolu nedir?

Birisi yukarıdaki soruların bazılarını (veya tümünü) açıklığa kavuşturabilir mi?


Metaoptimize.com'da sormayı deneyin
pajton

4
"Yüksek boyut" bazı kişiler için 20, bazı veriler için 50 veya 100 veya 1000'dir. Mümkünse lütfen rakam verin, örneğin "xx kullanarak dim 21, 1000000 veri noktaları yaptım".
denis

kD-Tree, verileri bir seferde bir boyut boyunca ikiye ayırır. 20 boyutunuz ve yalnızca 1M veri noktanız varsa, yaklaşık 1 düzey ağaç elde edersiniz - burada seviye her eksene bölünür. Gerçek bir derinlik olmadığından, ağacın dallarını göz ardı etme avantajından yararlanamazsınız. İkili bir ağaç olarak düşünmemek yararlıdır, ancak ikili bir ağaç gibi uygulansa da dörtlü bir ağaç, oktree vb.
phkahler

@denis, Higgs veri kümesi için 'dim 21, 1000000 veri noktası' mıydı?
nikk

1
Higgs veri kümesini indirmek için link. 28 nitelikte 11 Milyon gözlem. Son sütun etikettir: sinyal için 1, gürültü için sıfır. archive.ics.uci.edu/ml/datasets/HIGGS
nikk

Yanıtlar:


179

Şu anda bu tür bilgileri inceliyorum - sınıflandırma, en yakın komşu arama - müzik bilgilerinin alınması için.

Yaklaşık En Yakın Komşu ( YSA ) algoritmalarıyla ilgilenebilirsiniz . Fikir, algoritmanın komşuların yakınına geri dönmesine izin vermenizdir (belki de en yakın komşu değil); bunu yaparken karmaşıklığı azaltırsınız. Kd ağacından bahsettiniz ; bu bir örnek. Ama dediğin gibi, kd ağacı yüksek boyutlarda kötü çalışıyor. Aslında, tüm mevcut indeksleme teknikleri (uzay bölümlemeye dayalı) yeterince yüksek boyutlar için doğrusal aramaya düşer [1] [2] [3].

Yakın zamanda önerilen YSA algoritmaları arasında belki de en popüler olanı , yüksek boyutlu bir alandaki bir dizi noktayı bir dizi kutuya, yani bir karma tablosuna [1] [3] eşleyen Lokaliteye Duyarlı Karma ( LSH ). Ancak geleneksel karmalardan farklı olarak, bölgeye duyarlı bir karma yakındaki noktaları aynı bölmeye yerleştirir.

LSH'nin bazı büyük avantajları var. İlk olarak, basit. Veritabanınızdaki tüm noktalar için karma değerini hesaplayın, sonra onlardan bir karma tablosu yapın. Sorgulamak için, sorgu noktasının karmasını hesaplayın, sonra aynı kutudaki tüm noktaları karma tablosundan alın.

İkincisi, performansını destekleyen titiz bir teori var. Sorgu zamanının geldiğini gösterilebilir sublinear hızlı doğrusal arama daha, yani veritabanının boyutu. Ne kadar daha hızlı tahammül edebileceğimize bağlıdır.

Son olarak, LSH herhangi bir Lp normuyla uyumludur 0 < p <= 2. Bu nedenle, ilk sorunuza cevap vermek için LSH'yi Öklid uzaklık metriğiyle veya Manhattan (L1) uzaklık metriğiyle kullanabilirsiniz. Hamming mesafesi ve kosinüs benzerliği için de varyantlar vardır.

2008 yılında IEEE Sinyal İşleme Dergisi için Malcolm Slaney ve Michael Casey tarafından iyi bir genel bakış yazıldı [4].

LSH görünüşte her yere uygulandı. Denemek isteyebilirsiniz.


[1] Datar, Indyk, Immorlica, Mirrokni, "p-Stabil Dağılımlara Dayalı Lokasyon Duyarlı Hashing Şeması," 2004.

[2] Weber, Schek, Blott, "Yüksek boyutlu uzaylarda benzerlik arama yöntemleri için nicel bir analiz ve performans çalışması," 1998.

[3] Gionis, Indyk, Motwani, "Karma yoluyla yüksek boyutlarda benzerlik arayışı," 1999.

[4] Slaney, Casey, "En yakın komşuları bulmak için yere duyarlı karma", 2008.


1
@Steve: Cevabınız için teşekkür ederim. LSH uygulaması hakkında bazı önerileriniz var mı? Gördüğüm tek kişi MIT'den. Etrafta yüzen başka paketler var mı?
Efsane

1
Bunun dışında, hayır, başkalarını bilmiyorum. Sonunda özel amaçlar için Python'da kendimi yazdım. Esasen, her karma tablo bir Python sözlük olarak uygulanır, dnerede d[k]anahtarla bir bölmedir k. d[k]karması olan tüm noktaların etiketlerini içerir k. Sonra, her nokta için hash'ı hesaplamanız yeterlidir. Bkz. (1) [4] 'te veya Bölüm 3 [1]' de.
Steve Tjoa

@Steve: Yardımınız için teşekkürler. Şimdi uygulamaya başlayacağım. Bu metodolojinin büyük veri kümelerinde şans eseri nasıl performans gösterdiğine dair bir fikriniz var mı?
Efsane

1
LSH'yi destekleyen bir başka referans: Yüksek Boyutlu Uzayda En Yakın Komşu Algoritmaların Karşılaştırılması , Hendra Gunadi, 2011. cs.anu.edu.au/student/projects/11S2/Reports/Hendra%20Gunadi.pdf
Oliver Coleman

1
@SteveTjoa: Anahtar kelimeleri ve gömülü formülü görsel olarak kavramakta zorlandım. LSH'de zaten tek bir vurgu yaptığınız için, ekledim. Sadece en iyi niyetlerle. Yine de geri dönmekten çekinmeyin. Sonuçta senin cevabın bu. :)
Regexident

81

I. Mesafe Metriği

İlk olarak, bir veri kümesindeki özelliklerin (sütunlar) sayısı, kNN'de kullanılacak bir mesafe metriği seçiminde bir faktör değildir. Tam olarak bu soruya yönelik yayınlanmış az sayıda çalışma vardır ve karşılaştırma için olağan temeller şunlardır:

  • verilerinizin altında yatan istatistiksel dağılım;

  • verilerinizi oluşturan özellikler arasındaki ilişki (bağımsız mı - yani kovaryans matrisi neye benziyor); ve

  • verilerinizin alındığı koordinat alanı.

Verilerinizin örneklendiği dağıtım (lar) hakkında önceden bilginiz yoksa, en az bir (iyi belgelenmiş ve kapsamlı) çalışma Öklid mesafesinin en iyi seçim olduğu sonucuna varır.

Mega ölçekli Web Öneri Motorlarında ve güncel akademik araştırmalarda kullanılan YEuclidric metriği. Öklid tarafından hesaplanan mesafeler sezgisel bir anlama sahiptir ve hesaplama ölçekleri - yani Öklid mesafesi, iki nokta iki boyutta ya da yirmi iki boyut uzayında olsun aynı şekilde hesaplanır.

Benim için sadece birkaç kez başarısız oldu, bu vakaların her biri Öklid mesafesi başarısız oldu, çünkü alttaki (kartezyen) koordinat sistemi kötü bir seçimdi. Ve genellikle bunu fark edersiniz, çünkü örneğin yol uzunlukları (mesafeler) artık ilave değildir - örneğin, metrik alan bir satranç tahtası olduğunda, Manhattan mesafesi Öklidenden daha iyidir, aynı şekilde metrik alan Dünya ve mesafeleriniz trans olduğunda - kıta uçuşları, kutupsal koordinat sistemine uygun bir mesafe ölçüsü iyi bir fikirdir (örneğin, Londra'dan Viyana'ya 2.5 saat, Viyana'dan St.Petersburg'a 3 saat, aşağı yukarı aynı yönde, Londra'dan St. Petersburg 5.5 saat değil, 3 saatin biraz üzerindedir.)

Ancak, verilerinizin kartezyen olmayan bir koordinat sistemine ait olduğu durumlar dışında, mesafe metriği seçimi genellikle önemli değildir. ( Bir CS öğrencisinden bu blog yayınına bakın , kNN sınıflandırıcı - chi square üzerindeki etkilerini inceleyerek birkaç mesafe metriğini karşılaştırarak en iyi sonuçları verin, ancak farklılıklar büyük değildir; Daha kapsamlı bir çalışma akademik makalede, Karşılaştırmalı Çalışma En Yakın Komşuların Uzaklık İşlevleri Mahalanobis (esas olarak, boyut kovaryansını hesaba katarak normalleştirilmiş Öklid) bu çalışmada en iyisiydi.

Önemli bir şart: mesafe metrik hesaplamalarının anlamlı olması için, yeniden ölçeklendirmenizverileriniz - bunu yapmadan doğru tahminler oluşturmak için nadiren bir kNN modeli oluşturmak mümkündür. Örneğin, atletik performansı tahmin etmek için bir kNN modeli oluşturuyorsanız ve beklenti değişkenleriniz yükseklik (cm), ağırlık (kg), vücut yağ (%) ve dinlenme nabzı (dakikadaki atım) ise, tipik bir veri noktası olabilir şuna benzer: [180.4, 66.1, 11.3, 71]. Açıkça, mesafe hesaplamasına yükseklik hakim olacak,% vücut yağının katkısı neredeyse önemsiz olacaktır. Başka bir deyişle, bunun yerine, veriler farklı raporlandıysa, böylece vücut ağırlığı kilogram yerine gram cinsindeydi, o zaman 86.1, orijinal değeri 86.100 olur ve sonuçlarınız üzerinde büyük bir etkisi olur, istemiyorum.

X_new = (X_old - mu) / sigma


II. Veri Yapısı

Kd ağacı yapısının performansı hakkında endişeleriniz varsa, bir Voronoi Mozaikleme kavramsal olarak basit bir kaptır, ancak bu performansı ve ölçekleri kd-Ağaçlarından daha iyi bir şekilde artıracaktır.

dat

Bu, kNN eğitim verilerini sürdürmenin en yaygın yolu değildir, ancak VT'nin bu amaç için uygulanması ve bunun sonucu olarak ortaya çıkan performans avantajları iyi belgelenmiştir (bkz. Örneğin bu Microsoft Araştırma raporu ). Bunun pratik önemi, 'ana akım' bir dil kullanmanız koşuluyla (örneğin, TIOBE Endeksinde ) VT yapmak için bir kütüphane bulmanız gerektiğidir. Python ve R biliyorum örneğin her dil için birden fazla seçenek (vardır voronoi üzerinde R paketi mevcut CRAN )

KNN için VT kullanmak şu şekilde çalışır ::

Verilerinizden rastgele w noktaları seçin - bunlar Voronoi merkezlerinizdir. Bir Voronoi hücresi, her merkeze en yakın olan tüm komşu noktaları kapsar. Voronoi merkezlerinin her birine farklı bir renk atarsanız, belirli bir merkeze atanan her noktanın o renge boyanmasını hayal edin. Yeterli bir yoğunluğa sahip olduğunuz sürece, bunu yapmak her Voronoi merkezinin sınırlarını güzel bir şekilde gösterecektir (iki rengi ayıran sınır olarak).

Voronoi Merkezleri nasıl seçilir? İki dik yönerge kullanıyorum. W noktalarını rastgele seçtikten sonra egzersiz verileriniz için VT'yi hesaplayın. Daha sonra her bir Voronoi merkezine atanan veri noktalarının sayısını kontrol edin - bu değerler yaklaşık aynı olmalıdır (veri alanınız boyunca tekdüze nokta yoğunluğu verilmiştir). İki boyutta, bu aynı boyutta karolara sahip bir VT'ye neden olacaktır.İlk kural bu, ikincisi. Yinelemeye göre w'yi seçin - değişken parametre olarak kNN algoritmanızı w ile çalıştırın ve performansı ölçün (VT'yi sorgulayarak bir tahmin döndürmek için gereken süre).

Öyleyse bir milyon veri noktanız olduğunu hayal edin ..... Noktalar sıradan bir 2D veri yapısında veya bir kd ağacında kalsaydı, her biri için ortalama birkaç milyon mesafe hesaplaması yaparsınızYanıt değişkenini tahmin etmek istediğiniz yeni veri noktaları. Tabii ki, bu hesaplamalar tek bir veri kümesinde gerçekleştirilir. Bir V / T ile, en yakın komşu arama birbiri ardına iki adımda, iki farklı veri popülasyonuna karşı yapılır - önce Voronoi merkezlerine karşı, daha sonra en yakın merkez bulunduğunda, hücrenin içindeki noktalar o merkez en yakın komşuyu bulmak için aranır (birbirini izleyen mesafe hesaplamaları ile) Bu iki arama, tek bir kaba kuvvet bakışından çok daha hızlıdır. Bunu görmek kolaydır: 1M veri noktaları için, veri alanınızı incelemek üzere 250 Voronoi merkezi seçtiğinizi varsayalım. Ortalama olarak, her bir Voronoi hücresinde 4.000 veri noktası olacaktır. Yani ortalama 500.000 mesafe hesaplaması (kaba kuvvet) yapmak yerine, ortalamada sadece 125 + 2.000 gibi çok daha az performans gösterirsiniz.

III. Sonucu Hesaplama (tahmini yanıt değişkeni)

Bir grup kNN egzersiz verisinden tahmini değeri hesaplamak için iki adım vardır. Birincisi, n'yi veya bu hesaplama için kullanılacak en yakın komşu sayısını tanımlamaktır . İkincisi, öngörülen değere katkılarının nasıl ağırlıklandırılacağıdır .

İlk bileşen W / r / t, bir optimizasyon problemini (en küçük kareler optimizasyonuna çok benzer) çözerek n'nin en iyi değerini belirleyebilirsiniz. Teori bu; pratikte çoğu insan sadece n = 3 kullanır. Her halükarda, kNN algoritmanızı n = 1, n = 2, n = 3, vb. İçin bir dizi test örneği üzerinde çalıştırmak ve hatayı n'nin bir fonksiyonu olarak çizmek kolaydır. N'nin başlaması için makul bir değer istiyorsanız, yine n = 3 kullanın.

İkinci bileşen, her bir komşunun katkısının nasıl ağırlıklandırılacağıdır (n> 1 olduğu varsayılarak).

En basit ağırlıklandırma tekniği, her bir komşuyu sadece 1 / (dist * K) olan bir ağırlıklandırma katsayısı veya o komşudan test örneğine olan mesafenin tersi olarak çoğu zaman ampirik olarak türetilmiş bir sabit, K ile çarpmaktır. bu tekniğin bir hayranı değilim, çünkü genellikle en yakın komşuları aşırı ağırlaştırır (ve daha uzak olanları eşzamanlı olarak daha düşük ağırlıklar); bunun önemi, verilen bir tahminin neredeyse tamamen tek bir komşuya bağlı olabilmesidir, bu da algoritmanın gürültüye duyarlılığını arttırır.

Bu sınırlamayı büyük ölçüde önleyen daha iyi bir ağırlık fonksiyonu, python'da şöyle görünen gauss fonksiyonudur :

def weight_gauss(dist, sig=2.0) :
    return math.e**(-dist**2/(2*sig**2))

KNN kodunuzu kullanarak tahmin edilen bir değeri hesaplamak için, yanıt değişkenini tahmin etmek istediğiniz veri noktasına en yakın n komşuları tanımlayacaksınız ('test örneği'), ardından n_ komşularının her biri için bir kez weight_gauss işlevini çağıracaksınız. Bu fonksiyon, her komşu için ağırlığı döndürür, bu daha sonra ağırlıklı ortalama hesaplamasında komşunun katsayısı olarak kullanılır.


2
Mükemmel cevap! Deneyimlerime göre kapsamlı ve doğru.
Ted Dunning

Güzel cevap, +1, buraya daha yeni bir cevap ekledim , iyi mi?
gsamaras

1
"Öyleyse bir milyon veri noktanız olduğunu hayal edin ..... Noktalar sıradan bir 2D veri yapısında veya bir kd ağacında kalsaydı , yanıtı veren her yeni veri noktası için ortalama birkaç milyon mesafe hesaplaması yaparsınız. tahmin etmek istediğiniz değişken. " Katılmıyorum. KD ağaçlarının O(sqrt(n))2D'de arama karmaşıklığına sahip olduğu kanıtlanabilir .
Antoine

16

Karşılaştığınız şey boyutluluğun laneti olarak bilinir . Bazen 21 boyuta gerçekten ihtiyacınız olduğundan emin olmak için PCA veya ICA gibi bir algoritma çalıştırmak ve muhtemelen yaklaşık olarak aynı sonuç kalitesinde 21'den az kullanmanıza izin verecek doğrusal bir dönüşüm bulmak yararlı olabilir.

Güncelleme: Onlarla Rangayyan'ın Biyomedikal Sinyal İşleme adlı bir kitapta karşılaştım (umarım doğru hatırlarım). ICA önemsiz bir teknik değildir, ancak Finlandiya'daki araştırmacılar tarafından geliştirilmiştir ve bunun için Matlab kodunun herkese açık olarak indirilebileceğini düşünüyorum. PCA daha yaygın olarak kullanılan bir tekniktir ve R veya diğer yazılım uygulamalarını bulabilmeniz gerektiğine inanıyorum. PCA, lineer denklemlerin tekrar tekrar çözülmesi ile gerçekleştirilir. Nasıl olduğunu hatırlamak için çok uzun zaman önce yaptım. =)

Fikir, sinyallerinizi bağımsız özvektörlere (gerçekten ayrık özfonksiyonlar) ve bunların özdeğerlerine, sizin durumunuzda 21 ayırmanızdır. Her özdeğer, her özfonksiyonun ölçümlerinizin her birine sağladığı katkı miktarını gösterir. Bir özdeğer küçükse, karşılık gelen özfonksiyonu kullanmadan sinyalleri çok yakından temsil edebilirsiniz ve bu bir boyuttan nasıl kurtulacağınızdır.


+1 Teşekkürler. Bu çok ilginç bir öneri ve mantıklı. Son bir talep olarak, bunu etkileşimli olarak nasıl yapacağınızı açıklayan herhangi bir uygulamalı öğreticiye (python veya R veya başka bir dilde) aşina mısınız (yani tüm süreci adım adım açıklamak). Dünden beri birkaç belge okudum ama çoğu benim anlayışımın dışında görünüyor. Baska öneri?
Efsane

4
Nitpicking: ICA bir boyut küçültme algoritması değildir. Bileşenlerin nasıl puanlanacağını bilmiyor ve bu şekilde kullanılmamalıdır.
Gael Varoquaux

12

En iyi cevaplar eski ama eski, bu yüzden 2016 cevabı eklemek istiyorum .


Söylendiği gibi, yüksek boyutlu bir alanda, boyutsallığın laneti köşede dolaşıyor ve popüler kd ağacı gibi geleneksel yaklaşımların kaba kuvvet yaklaşımı kadar yavaş olmasını sağlıyor. Sonuç olarak, bir miktar doğruluk lehine süreci hızlandıran Yaklaşık En Yakın Komşu Arama'ya (ANNS) olan ilgimizi artırıyoruz . Tam NN'ye iyi bir yaklaşımla iyi bir yaklaşım elde edersiniz.


Değerli olabilecek sıcak konular:

  1. Razenshteyn'in LSH gibi modern yaklaşımları .
  2. RKD ormanı : FLANN'de açıklandığı gibi veya daha yakın bir yaklaşımda kd-GeRaF'ın parçası olduğum Rastgele kd ağaçlarının (RKD) ormanları .
  3. Burada açıklandığı gibi Yerel Olarak Optimize Edilmiş Ürün Nicemlemesi anlamına gelen LOPQ . Yeni Babenko + Lemptitsky'nin yaklaşımına çok benziyor .

İlgili cevaplarımı da kontrol edebilirsiniz:

  1. İki set yüksek boyutlu nokta: Diğer sette en yakın komşuyu bulun
  2. En Yakın Komşu sorgularının çalışma süresinin farklı veri yapılarında karşılaştırılması
  3. PCL kd ağacı uygulaması son derece yavaş

8

Sorularınızı tek tek cevaplamak için:

  • Hayır, öklid mesafesi yüksek boyutlu uzayda kötü bir metriktir. Temel olarak yüksek boyutlarda, veri noktalarının birbirleri arasında büyük farkları vardır. Bu, belirli bir veri noktası ile en yakın ve en yakın komşusu arasındaki mesafedeki göreceli farkı azaltır.
  • Çok sayıda makale / araştırma yüksek boyutlu verilerde var, ancak çoğu şey çok fazla matematiksel karmaşıklık gerektiriyor.
  • KD ağacı yüksek boyutlu veriler için kötü ... elbette kaçının

İşte size doğru yönde başlamak için güzel bir makale. " En Yakın Komşu Ne Zaman Anlamlı ?" tarafından Beyer et all.

20K ve üstü boyutlardaki metin verileriyle çalışıyorum. Metinle ilgili tavsiye almak isterseniz, size yardımcı olabilirim.


1
+1 Şimdi okumak için o kağıdı yazdırıyorum. Bu arada, en yakın komşuları nasıl anlayacağınız konusunda önerileriniz var mı? Hem mesafe metriği hem de komşunun kendisinin tanımı kusurluysa, insanlar genellikle özellik vektörlerine dayanarak yaklaşık eşleştirme yapmak istedikleri daha yüksek boyut sorunlarını nasıl çözer? Baska öneri?
Efsane

1
Metin söz konusu olduğunda kosinüs benzerliği çok kullanılır. Metin sınıflandırmasında kendim çalışıyorum ve yüksek boyutlar için doğrusal çekirdekli SVM'nin en etkili olduğunu düşünüyorum.
BiGYaN

@BiGYaN Alanınızı nasıl tanımladınız? Yani kelime vektörü veya gömülü vektörün bage'sine dayanıyor mu?
user3487667

@ user3487667, Alan, sorununuzu nasıl formüle ettiğinize bağlıdır. Basit bir kelime torbası modelinden bahsediyordum.
BiGYaN

5

Kosinüs benzerliği yüksek boyutlu vektörleri karşılaştırmanın yaygın bir yoludur. Mesafe değil benzerlik olduğundan, simge durumuna küçültmemek için maksimize etmek istediğinizi unutmayın. Verileri karşılaştırmak için alana özgü bir yol da kullanabilirsiniz, örneğin verileriniz DNA dizileriyse, mutasyonların vb. Olasılıklarını dikkate alan bir dizi benzerliği kullanabilirsiniz.

Kullanılacak en yakın komşu sayısı, veri türüne, ne kadar gürültü olduğuna vb. Bağlı olarak değişir. Genel kurallar yoktur, bir aralık içindeki tüm değerleri deneyerek belirli verileriniz ve sorununuz için en iyi olanı bulmanız yeterlidir. . İnsanlar sezgisel bir anlayışa sahip olurlar, ne kadar çok veri olursa, o kadar az komşuya ihtiyacınız olur. Mümkün olan tüm verilere sahip olduğunuz varsayımsal bir durumda, sadece sınıflandırmak için en yakın komşuyu aramanız gerekir.

En Yakın Komşu yönteminin hesaplama açısından pahalı olduğu bilinmektedir. İnsanların destek vektör makineleri gibi diğer algoritmalara yönelmelerinin ana nedenlerinden biridir.


Bu ilginç. Benim durumumda SVM'leri nasıl kullanabileceğim hakkında daha fazla ayrıntı verebilir misiniz? En yakın komşuların daha çok denetimsiz olduğunu ve SVM'lerin denetlendiğini düşündüm. Yanlışım varsa lütfen düzelt.
Efsane

2
Her iki yöntem de denetlenir, çünkü egzersiz verileriniz doğru sınıflarla açıklanır. Yalnızca özellik vektörlerine sahipseniz ve ait oldukları sınıfları bilmiyorsanız, kNN veya SVM'leri kullanamazsınız. Gözetimsiz öğrenme yöntemlerine genellikle kümeleme algoritmaları denir. Benzer veri gruplarını tanımlayabilirler, ancak size grupların ne anlama geldiğini söylemezler.
Colin

Açıklama için teşekkürler. Haklısın. Gerçekten de denetimli bir tekniktir. Ben sadece kategoriler olarak adlandırdıklarımın aslında sınıflar olduğunun farkına
Efsane

4

kd ağaçları aslında yüksek boyutlu veriler üzerinde çok iyi çalışmaz. Çünkü budama adımı artık çok fazla yardımcı olmuyor, çünkü en yakın kenar - 1 boyutlu bir sapma - neredeyse her zaman bilinen en yakın komşuların tam boyutlu sapmasından daha küçük olacaktır.

Dahası, kd ağaçları bildiğim her şey için sadece Lp normları ile iyi çalışır ve mesafe tabanlı algoritmaları artan boyutluluk ile bozan mesafe konsantrasyonu etkisi vardır.

Daha fazla bilgi için, boyutluluğun lanetini ve bunun çeşitli varyantlarını okumak isteyebilirsiniz (birden fazla tarafı var!)

LSH veya rastgele projeksiyonlar kullanarak Öklid'in en yakın komşularını körü körüne yaklaştırmak için çok fazla kullanım olduğuna ikna olmadım. İlk etapta çok daha ince bir ayarlanmış mesafe fonksiyonu kullanmak gerekebilir!


1. ve 2. paragraflarınız için referanslarınız var mı?
Chuck

Hayır, ancak olağan "boyutsallığın laneti" örneklerinden (cf, anket ) oldukça açık olmalılar ve Öklidenden başka bir şeyi destekleyen herhangi bir kd ağacı bulmaya çalışmalılar ... diğer mesafeleri desteklemek mümkündür, ancak yaygın değildir (ELKI tüm Minkowski mesafelerine + kareli Öklidere izin verir, ancak çoğunda sadece Öklid bulunur). Sadece kd ağaçlarının budama için bir boyut kullandığını düşünün ve bunu tüm boyutları içeren mesafeyle karşılaştırın . Ayrıca, bölünmeleriniz her boyutta bölünemez.
Erich Schubert

3

Birçok şey neden en yakın komşuları bilmek istediğinize bağlıdır. Gerçekten istediğiniz veri kümenizin modlarını bulmaksa, http://en.wikipedia.org/wiki/Mean-shift ortalama kaydırma algoritmasına bakabilirsiniz .


2
Bildiğim kadarıyla Mean-Shift, yüksek boyutlu verileri kümelemek için uygun değil. K-Ortalamalar daha iyi bir seçim olabilir.
fdermishin

3

Bence boolean özelliklerin tf-idf kosinüsü çoğu sorun için iyi çalışır. Çünkü zamanı kanıtlanmış buluşsal yöntemi Lucene gibi birçok arama motorunda kullanılmıştır. Deneyimlerimdeki Öklid mesafesi, metin benzeri veriler için kötü sonuçlar gösteriyor. Farklı ağırlıkların ve k örneklerinin seçilmesi egzersiz verileri ve kaba kuvvet parametre seçimi ile yapılabilir.


3

iDistance muhtemelen yüksek boyutlu verilerde kesin düğüm alımı için en iyisidir. Yaklaşık bir Voronoi tessalasyonu olarak görebilirsiniz.


3

Aynı sorunu yaşadım ve şunları söyleyebilirim.

  1. Öklid mesafesi iyi bir mesafe metriğidir, ancak Manhattan mesafesinden hesaplamalı olarak daha pahalıdır ve bazen biraz daha kötü sonuçlar verir, bu nedenle daha sonra seçerim.

  2. K değeri ampirik olarak bulunabilir. Kabul edilebilir bir değer bulmak için farklı değerler deneyebilir ve elde edilen ROC eğrilerini veya başka bir hassas / geri çağırma ölçüsünü kontrol edebilirsiniz .

  3. Hem Öklid hem de Manhattan mesafeleri Üçgen eşitsizliğine saygı duyar , böylece bunları metrik ağaçlarda kullanabilirsiniz. Gerçekten de, veriler 10'dan fazla boyuta sahip olduğunda KD-ağaçlarının performansı ciddi şekilde düşer (Bu sorunu kendim yaşadım). VP ağaçlarının daha iyi bir seçenek olduğunu gördüm .


3

KD Ağaçlar 21 puan için iyi çalışır, eğer erken ayrılırsanız, tüm noktaların% 5'ini inceledikten sonra. FLANN bunu (ve diğer hız artışlarını ) 128-dim SIFT vektörleriyle eşleştirmek için yapar. (Ne yazık ki FLANN yalnızca Öklid metriğini ve hızlı ve sağlam scipy.spatial.cKDTree yalnızca Lp metriklerini yapar; bunlar sizin için yeterli olabilir veya olmayabilir verileri.) Buraya Tabii bir hız-doğruluk haddin yoktur.

(Ndata, Nquery, veri dağıtımınızı tanımlayabilirseniz, bu kişilerin benzer verileri denemelerine yardımcı olabilir.)

Fizibilite hakkında çok kaba bir fikir vermek için eski mac ppc'de cKDTree için çalışma süreleri olan 26 Nisan eklendi:

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=1000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.1 % of the 1000000 points, 0.31 % of 188315 boxes; better 0.0042 0.014 0.1 %
3.5 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.253

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=5000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.48 % of the 1000000 points, 1.1 % of 188315 boxes; better 0.0071 0.026 0.5 %
15 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.245

2

Az sipariş eğrisini deneyebilirsiniz. 3 boyut için kolaydır.


0

Öklid mesafesi en yakın komşuları bulmak için iyi bir ölçüm mü? Değilse, seçeneklerim nelerdir?

En alt boyutları bulmak için özellik ağırlıklarının hesaplandığı, günümüzde oldukça yaygın bir yaklaşım olan yumuşak altuzay kümelenmesini öneririm . Bu ağırlıkları, örneğin öklid mesafesini kullanırken kullanabilirsiniz. Yaygın sorunlar için boyutsallığın lanetine bakın ve ayrıca bu makale sizi bir şekilde aydınlatabilir:

Karışık sayısal ve kategorik veri kümelerinin altuzay kümelemesi için k-tipi tip kümeleme algoritması

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.