Bagaimana Anda menguji implementasi k-means?


11

Penafian: Saya memposting pertanyaan ini di Stackoverflow, tapi saya pikir mungkin ini lebih cocok untuk platform ini.

Bagaimana Anda menguji implementasi k-means Anda sendiri untuk set data multidimensi?

Saya sedang berpikir untuk menjalankan implementasi yang sudah ada (yaitu, Matlab) pada data dan membandingkan hasilnya dengan algoritma saya. Tetapi ini akan membutuhkan kedua algoritma untuk bekerja lebih dari yang kira-kira sama, dan pemetaan antara kedua hasil tersebut mungkin tidak mudah.

Apakah Anda punya ide yang lebih baik?

Jawaban:


10

K-means termasuk komponen stokastik, jadi sangat tidak mungkin Anda akan mendapatkan hasil yang sama kecuali Anda memiliki implementasi yang persis sama dan menggunakan konfigurasi awal yang sama. Namun, Anda bisa melihat apakah hasilnya sesuai dengan implementasi terkenal (tidak tahu tentang Matlab, tetapi implementasi algoritma k-means dalam R dijelaskan dengan baik, lihat Hartigan & Wong, 1979 ).

Adapun untuk membandingkan dua seri hasil, masih ada masalah dengan label switching jika ingin dijalankan beberapa kali. Sekali lagi, dalam paket e1071 R, ada fungsi yang sangat praktis (; matchClasses()) yang dapat digunakan untuk menemukan pemetaan 'terbaik' antara dua kategori dalam tabel klasifikasi dua arah. Pada dasarnya, idenya adalah untuk mengatur ulang baris sehingga memaksimalkan perjanjian mereka dengan kolom, atau menggunakan pendekatan rakus dan permute baris dan kolom sampai jumlah diagonal (perjanjian baku) maksimal. Koefisien perjanjian seperti statistik Kappa juga disediakan.

Terakhir, tentang cara membandingkan implementasi Anda, ada banyak data yang tersedia secara bebas, atau Anda dapat mensimulasikan set data khusus (misalnya, melalui model campuran hingga, lihat paket MixSim ).


hai chi, terima kasih atas jawabannya. Bila mau, Anda juga dapat menjawab pertanyaan yang identik di SO dan saya akan menerimanya di sana juga. => stackoverflow.com/questions/4280371/…
Framester

(+1) Paragraf pertama dengan cepat sampai ke inti permasalahan.
whuber

6

Pemetaan antara dua set hasil mudah untuk dihitung, karena informasi yang Anda peroleh dalam pengujian dapat direpresentasikan sebagai serangkaian tiga tupel: komponen pertama adalah titik (multidimensi), yang kedua adalah label kluster (arbitrer) disediakan oleh algoritma Anda, dan yang ketiga adalah label cluster (arbitrer) yang disediakan oleh algoritma referensi. Bangun oleh kkktabel klasifikasi untuk pasangan label: jika hasilnya setuju, itu akan menjadi kelipatan dari matriks permutasi. Artinya, setiap baris dan setiap kolom harus memiliki tepat satu sel bukan nol. Itu pemeriksaan sederhana untuk program. Ini juga mudah untuk melacak penyimpangan kecil dari ideal ini kembali ke poin data individual sehingga Anda dapat melihat dengan tepat bagaimana dua jawaban berbeda jika mereka berbeda sama sekali. Saya tidak akan repot-repot menghitung ukuran statistik dari perjanjian: apakah ada kesepakatan sempurna (hingga permutasi) atau tidak, dan dalam kasus terakhir Anda perlu melacak semua poin ketidaksepakatan untuk memahami bagaimana mereka terjadi. Hasilnya baik setuju atau tidak; jumlah ketidaksepakatan, bahkan pada satu titik saja, perlu diperiksa.

Anda mungkin ingin menggunakan beberapa jenis dataset untuk pengujian: (1) dataset yang diterbitkan dengan hasil k-means yang dipublikasikan; (2) dataset sintetis dengan kluster kuat yang jelas; (3) dataset sintetis tanpa pengelompokan yang jelas. (1) adalah disiplin yang baik untuk menggunakan setiap kali Anda menulis setiap matematika atau statistik Program. (2) mudah dilakukan dalam banyak cara, seperti dengan menghasilkan beberapa titik acak untuk berfungsi sebagai pusat cluster dan kemudian menghasilkan awan titik dengan secara acak memindahkan pusat cluster jumlah yang relatif kecil. (3) memberikan beberapa pemeriksaan acak yang berpotensi mengungkap perilaku tak terduga; lagi, itu adalah disiplin pengujian umum yang bagus.

ivvi0,1,2,,n1nknk

d2uv2dxzxz

w=z(zx)x.

ywxyxydncos(2πk/n)x+sin(2πk/n)yk0n1


(+1) Komentar Anda tentang cara yang memungkinkan untuk menghasilkan data sintetis yang relevan sangat disambut baik.
chl

2

Salah satu pendekatan 'naif' yang sangat sederhana adalah dengan menggunakan data sintetik sederhana, untuk itu setiap implementasi harus menghasilkan cluster yang sama.

Contoh dalam Python dengan import numpy as np:

test_data = np.zeros((40000, 4))
test_data[0:10000, :] = 30.0
test_data[10000:20000, :] = 60.0
test_data[20000:30000, :] = 90.0
test_data[30000:, :] = 120.0

Untuk n_clusters = 4itu harus memberi Anda permutasi[30, 60, 90, 120]


0

Karena k-means berisi keputusan yang dipilih secara acak (hanya bagian inisialisasi), saya pikir cara terbaik untuk mencoba algoritma Anda adalah dengan memilih poin awal dan membiarkannya diperbaiki dalam algoritma Anda terlebih dahulu dan kemudian pilih kode sumber lain dari algoritma dan perbaiki poin dengan cara yang sama. Kemudian Anda dapat membandingkan hasilnya secara nyata.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.