Algoritma Birch tidak mengelompok seperti yang diharapkan

10

Saya menggunakan algoritma Birch dari paket Python scipy-learn untuk mengelompokkan satu set poin di satu kota kecil dalam set 10.

Saya menggunakan kode berikut:

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

Dalam ide saya, saya akan selalu berakhir dengan set 10 poin. Dalam kasus saya sekarang, saya memiliki 650 poin untuk dikelompokkan, dan n_clusters adalah 65.

Tapi, masalah saya adalah bahwa dengan ambang yang terlalu rendah saya berakhir dengan 1 alamat sebuah cluster, hanya ambang yang lebih kecil - 40 alamat per cluster.

Apa yang saya lakukan salah di sini?

kaboom
sumber
Mungkin itu CRS. Masalah? Jika Anda mencoba dengan derajat (seperti WGS 84), coba metrik. Ada perbedaan yang cukup besar dalam koordinat dan keduanya dapat memerlukan nilai ambang yang berbeda. Anda juga dapat mencoba dengan pustaka python yang berbeda, saya sangat menyarankan untuk menggunakan scikit-learn.
dmh126
..erm, saya mengelompokkan berdasarkan koordinat GPS yang diterima dari Google API, saya kira mereka diformat standar. Tidak?
kaboom
Mungkin tempel di sini koordinat ini, saya akan mencoba mencari tahu.
dmh126
dmh126 mungkin benar: Goolge API bekerja dengan WGS84, ini adalah Sistem Geodetik (Dunia), bukan metrik
André

Jawaban:

10

Saya sudah melakukan riset. Saya mengambil beberapa poin dalam dua sistem koordinat non metrik (WGS84) dan metrik (Polandia 1992).

Saya menggunakan kode ini:

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)

Lalu saya cocokkan model kami dengan data metrik:

brc.fit(data90)

Dan plot hasilnya, di mana titik silang adalah titik saya dan lingkaran adalah subclusters saya:

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

Inilah yang saya dapat: masukkan deskripsi gambar di sini

Anda dapat melihat, nilai ambang itu terlalu kecil, karena ditemukan subkluster di setiap titik.

Definisi ambang batas:

Jari-jari subkluster yang diperoleh dengan menggabungkan sampel baru dan subkluster terdekat harus lebih rendah dari ambang batas. Kalau tidak, subkluster baru dimulai.

Jadi dalam hal ini kita perlu meningkatkan nilai ini.

Untuk:

brc = Birch(threshold=5000)

itu jauh lebih baik:

masukkan deskripsi gambar di sini

Dan poin WGS84 untuk ambang 0,5:

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

masukkan deskripsi gambar di sini

Hanya satu subkluster, tidak bagus. Tetapi dalam hal ini kita harus mengurangi nilai ambang, jadi untuk 0,05:

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

masukkan deskripsi gambar di sini

Kami mendapat hasil yang bagus.

Kesimpulan:

CRS penting. Anda perlu menemukan nilai ambang yang tepat, tergantung pada sistem koordinat data Anda dan jarak antar titik. Jika Anda memiliki CRS non metrik, ambang batas harus relatif lebih kecil daripada dengan sistem metrik. Anda harus tahu perbedaan antara meter dan derajat, jika jarak antara dua titik sama dengan 10000m, itu akan kurang dari 1 derajat di WGS84. Periksa google untuk mendapatkan nilai yang lebih akurat.

Juga ada lebih banyak poin daripada nilai n_clusters. Tidak apa-apa, tidak ada centroid dari kluster, tetapi subkluster. Jika Anda mencoba memprediksi sesuatu, atau mencetak label, itu akan mengklasifikasikan poin Anda ke salah satu area n_clusters (atau mencetak poin yang diklasifikasikan ke 0,1,2, ..., label n_clusters).

Jika Anda tidak ingin mencoba parameter yang berbeda, Anda selalu dapat mengambil algoritma lain. Algoritma yang sangat sederhana dan umum untuk pengelompokan adalah algoritma K-means.

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

Itu harus menemukan n cluster untuk data Anda tanpa peduli tentang ambang batas dll.

dmh126
sumber