8

Scikit dbscan algoritmasını çalıştırırken Bellek Hatası aldım. Verilerim yaklaşık 20000 * 10000, ikili bir matris.Scikit-öğrenmede DBSCAN seyrek matris kullanabilir mi?

(Belki. Ben makine öğrenme acemiyim böyle bir matris ile DBSCAN kullanmak uygun değildir. Ben sadece bir başlangıç ​​küme numarası gerekmez küme yöntemi bulmak istiyorum) neyse

Ben seyrek matris ve scikit özellik çıkarma bulundu.

http://scikit-learn.org/dev/modules/feature_extraction.html http://docs.scipy.org/doc/scipy/reference/sparse.html

Ama yine nasıl kullanılacağını bilmiyorsunuz. DBSCAN'ın spesifikasyonunda, seyrek matris kullanımı hakkında bir gösterge yoktur. İzin verilmiyor mu?

DBSCAN'da seyrek matrisin nasıl kullanılacağını bilen varsa, lütfen bana bildirin. Ya da bana daha uygun bir küme yöntemi söyleyebilirsin.

+0

Olası yinelenen [scikit-öğrenme DBSCAN bellek kullanımını] (http://stackoverflow.com/questions/16381577/scikit-learn-dbscan-memory-usage) –

cevap

1

Sen böylece numune matrisi X varsayarak, DBSCAN bir mesafe matrisi geçebilir, aşağıdaki çalışması gerekir:

Ancak
from sklearn.metrics.pairwise import euclidean_distances 

D = euclidean_distances(X, X) 
db = DBSCAN(metric="precomputed").fit(D) 

, matris D bile olacak X'dan büyük: n_samples ² girişleri. Seyrek matrisler ile k-araçları muhtemelen en iyi seçenektir.

(Bu kümeler önceden belirlenmiş sayıda ihtiyaç duymaz, çünkü DBSCAN cazip görünebilir, ancak bu ayar yapmak zorunda iki parametreler için. Bu numuneler uzayda noktalardır ayarlarında çoğunlukla uygulanabilir olduğunu esnaf ve sen aynı kümede olmak olmak bu noktaları istediğiniz kadar yakın biliyoruz, yoksa kara kutu mesafe metrik olduğunda desteklemez scikit-öğrenirler.) DBSCAN ait scikit uygulamasıdır

+1

DBSCAN, uzaklık matrisini gerektirmez, bu, algoritmanın değil, geçerli sklearn uygulamasının bir sınırlamasıdır. Ayrıca, birçok durumda, DBSCAN'ın hem epsion hem de minpts parametresi seçilebilir * çok * k 'den daha kolaydır. Örneğin, coğrafi verileri kullanırken, bir kullanıcı "1 km" yarıçapının iyi bir epsilon olduğunu ve bu yarıçapta en az 10 olay olması gerektiğini söyleyebilir. –

+0

@ Anony-Mousse: Sorunların, algoritmada değil, uygulamada olduğunun farkındayım. Eps ve minpt'leri seçmek için, evet, kolay olabilecek bazı problemler için, ancak diğerleri için, kapsamlı ayarlama gerekebilir. Tüm problemler Öklid uzayında ve hatta dünyanın yüzeyinde yaşanmaz. –

5

maalesef Çok naif. Endekslenmeyi (top ağacı vb.) Hesaba katmak için yeniden yazılmalıdır. Şu an itibariyle, bir lot hafızasını harcayan tam bir mesafe matrisinin hesaplanması konusunda ısrarcı olacaktır.

Sadece DBSCAN'ı yeniden düzenlemenizi önerebilir miyim? Oldukça kolay, iyi bir sözde kod var örn. Wikipedia'da ve orijinal yayınında. Sadece birkaç satır olmalı ve veri gösterimlerinizden kolayca faydalanabilirsiniz. Örneğin. zaten bir benzerlik grafiğine sahipseniz, bir "aralık sorgusu" yapmak (genellikle uzaklık eşiğinizi karşılayan kenarları kullanın) genellikle oldukça önemsizdir (

Burada, uygulamanın iyileştirilmesi hakkında konuştukları bir issue in scikit-learn github var. . Bir kullanıcı topunu kullanarak 50x daha hızlı bir versiyonunu rapor ediyor (ki bu beni şaşırtmadı, daha önce indekslerle benzer hızları gördüm - veri seti büyüklüğünü daha da artırdığında daha belirgin hale gelecektir).

Güncelleştirme: scikit-learn'deki DBSCAN sürümü, bu yanıt yazıldığı için önemli geliştirmeler aldı.

+2

DSSCAN'ın top ağaçları kullanmak için değiştirildiği scikit-learn 0.14 ile ilgilenebilirsiniz. –

+0

ayrıca DBSCAN şimdi v0.16'daki seyrek girişi destekliyor – titus

İlgili konular