Huş algoritması beklendiği gibi kümelenmiyor


10

Scipy-learn Python paketinden Birch algoritmasını 10'lu küçük bir şehirde bir dizi noktayı kümelemek için kullanıyorum.

Aşağıdaki kodu kullanıyorum:

no = len(list_of_points)/10
brc = Birch(branching_factor=50, n_clusters=no, threshold=0.05,compute_labels=True)

Benim düşünceme göre, her zaman 10 puanlık setlerle sonuçlanırdım. Benim durumumda, küme için 650 puan var ve n_clusters 65.

Ama benim sorunum, çok düşük eşik değeriyle 1 adresin bir kümeyle, daha küçük bir daha büyük eşiğin - küme başına 40 adresle sonuçlanmasıdır.

Burada neyi yanlış yapıyorum?


Belki de CRS. Sorun? Derecelerle denediyseniz (WGS 84 gibi), metriği deneyin. Koordinatlarda oldukça büyük bir fark vardır ve her ikisi de farklı eşik değeri gerektirebilir. Ayrıca farklı python kütüphanesi ile deneyebilirsiniz, scikit-learn kullanmanızı şiddetle tavsiye ederim.
dmh126

..erm, Google API'sından alınan GPS koordinatlarına dayanarak kümeleniyorum, standart biçimlendirilmiş olduklarını varsayıyorum. Hayır?
kaboom

Belki buraya bu koordinatları yapıştırın, anlamaya çalışacağım.
dmh126

dmh126 doğru olabilir: Goolge API WGS84 ile çalışıyor, bu bir (Dünya) Jeodezik Sistem, bir metrik değil
André

Yanıtlar:


10

Biraz araştırma yaptım. Metrik olmayan iki koordinat sisteminde (WGS84) ve metrikte (Polonya 1992) bazı puanlar aldım.

Bu kodu kullandım:

from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt

data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")

brc = Birch(threshold=0.5)

Sonra modelimizi metrik verilerle sığdırıyorum:

brc.fit(data90)

Ve sonuçları, haçların puanlarımın ve dairelerin alt kümelerim olduğu planlayın:

c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()

Elimde bu var: resim açıklamasını buraya girin

Gördüğünüz gibi, bu eşik değeri çok küçüktü, çünkü her noktada altküme bulmuş.

Eşik tanımı:

Yeni bir numunenin ve en yakın alt kümenin birleştirilmesiyle elde edilen altkümenin yarıçapı eşik değerden daha az olmalıdır. Aksi takdirde yeni bir altküme başlatılır.

Bu durumda bu değeri artırmamız gerekiyor.

İçin:

brc = Birch(threshold=5000)

çok daha iyiydi:

resim açıklamasını buraya girin

Ve WGS84 0.5 eşiğini işaret ediyor:

brc = Birch(threshold=0.5)
brc.fit(data84)

resim açıklamasını buraya girin

Sadece bir altküme, iyi değil. Ancak bu durumda eşik değerini azaltmalıyız, yani 0.05 için:

brc = Birch(threshold=0.05)
brc.fit(data84)

resim açıklamasını buraya girin

Güzel sonuçlar aldık.

Sonuç:

CRS önemlidir. Veri koordinat sistemlerinize ve noktalar arasındaki mesafeye bağlı olarak uygun bir eşik değeri bulmanız gerekir. Metrik olmayan CRS'niz varsa, eşik, metrik sistemden daha küçük olmalıdır. Metre ve derece arasındaki farkı bilmek zorundasınız, eğer iki nokta arasındaki mesafe 10000m'ye eşitse, WGS84'te 1 dereceden az olacaktır. Daha doğru değerler için Google'ı kontrol edin.

Ayrıca n_clusters değerinden daha fazla puan var. Tamam, kümelerin sentroidleri değil, alt kümeler var. Bir şeyi tahmin etmeye veya etiket yazdırmaya çalışırsanız, noktanızı n_clusters alanlarından birine (veya 0,1,2, ..., n_clusters etiketine sınıflandırılmış baskı noktaları) göre sınıflandırır.

Farklı parametreleri denemek istemiyorsanız, her zaman başka bir algoritma kullanabilirsiniz. Kümeleme için çok basit ve yaygın bir algoritma K-demektir algoritmasıdır.

http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

Eşikler vb. İle ilgilenmeden verileriniz için n küme bulmalıdır.

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.