1. Pendahuluan
Algoritma pengelompokan K-Mean pertama kali secara acak memilih objek K sebagai pusat pengelompokan awal. Jarak antara masing -masing objek dan pusat setiap cluster benih kemudian dihitung, dan setiap objek ditetapkan ke pusat cluster yang paling dekat dengannya. Pusat cluster dan objek yang ditetapkan untuk mereka mewakili cluster. Setelah semua objek dialokasikan, pusat cluster dari masing -masing cluster dihitung ulang berdasarkan objek yang ada di cluster. Proses ini akan diulangi sampai kondisi penghentian tertentu dipenuhi. Kondisi penghentian dapat berupa bahwa tidak ada (atau angka minimum) objek yang dipindahkan ke berbagai kelompok, tidak ada (atau angka minimum) pusat cluster berubah lagi, dan jumlah kesalahan kuadrat minimal secara lokal.
2. Apa yang sedang dikelompokkan
Clustering adalah proses penyortiran dan pengorganisasian anggota data yang serupa dalam aspek -aspek tertentu. Clustering adalah teknologi untuk menemukan struktur internal ini. Teknologi pengelompokan sering disebut pembelajaran tanpa pengawasan.
3. Apa itu K-Mean Clustering
Clustering K-Mean adalah algoritma pengelompokan partisi paling terkenal, dan karena kesederhanaan dan efisiensinya, ia telah menjadi yang paling banyak digunakan dari semua algoritma pengelompokan. Dengan set titik data dan jumlah kluster K, k yang diperlukan ditentukan oleh pengguna, dan algoritma K-Mean berulang kali membagi data menjadi kluster K sesuai dengan fungsi jarak tertentu.
4. Implementasi
Kode Java adalah sebagai berikut:
Paket org.algorithm; impor java.util.arraylist; impor java.util.random;/*** k-mean clustering algoritma*/kelas publik kmeans {private int k; // berapa banyak kelompok yang dibagi menjadi thats di data,//sejumlah iterasi interasi pribadi datasetlength; ArrayList <float []> dataset; // Dataset Linked Listed Private ArrayList <float []> center; // Center Linked Listed Private ArrayList <ArrayList <float [float []> cluster; // Cluster Private ArrayList <float> jc; // Jumlah kesalahan swale; @param dataSet */public void setDataSet(ArrayList<float[]> dataSet) {this.dataSet = dataSet;}/** * Get the result grouping* * @return result set*/public ArrayList<ArrayList<float[]>> getCluster() {return cluster;}/** * Constructor, pass in the number of clusters to be divided* * @param k * Jumlah cluster, jika k <= 0, diatur ke 1, jika k lebih besar dari panjang sumber data, diatur ke panjang sumber data*/public kmeans (int k) {if (k <= 0) {k = 1;} this. == 0) {initDataSet();}dataSetLength = dataSet.size();if (k > dataSetLength) {k = dataSetLength;}center = initCenters();cluster = initCluster();jc = new ArrayList<float>();}/** * If the caller has not initialized the dataset, the internal test dataset is used*/private void initdataSet () {dataset = new arraylist <float []> (); // di mana {6,3} adalah sama, jadi kesalahan membagi dataset panjang 15 menjadi 14 cluster dan 15 cluster adalah 0 float [] [] {2, {2, {2, {2, {4, {4, 2, {] {2 {] {{8, 2 {] {{8, 2, 7, 3}, {6, 2}, {4, 7}, {6, 3}, {5, 3}, {6, 3}, {6, 9}, {1, 6}, {3, 9}, {4, 1}, {8, 6}}; untuk (int i = 0 {dataSet.add(dataSetArray[i]);}}/** * Initialize the central data link list, and there are as many center points as the clusters are divided into* * @return Center point set*/private ArrayList<float[]> initCenters() {ArrayList<float[]> center = new ArrayList<float[]>();int[] randoms = new int[k];Boolean flag; int temp = random.nextInt (datasetLength); randoms [0] = temp; for (int i = 1; i <k; i ++) {flag = true; while (flag) {temp = random.nextint (datasetLength); int j = 0; // saya tidak yakin bahwa loop yang menyebabkan j untuk bersatu); {{{{{{{{i for J); if (temp == random [j]); // { // merusak; //} //} while (j <i) {if (temp == random [j]) {break;} j ++;} if (j == i) {flag = false;} est [i] = temp;} // uji situasi pembuatan angka acak // untuk (int i = 0; i <k; i ++) // System.out.println ("test1: random ["+i+"] ="+random [i]); //} // System.out.println (); for (int i = 0; i < k; i++) {center.add(dataSet.get(randoms[i]));// Generate initialization center link}return center;}/** * Initialization cluster set* * @return A cluster of empty data divided into k clusters*/private ArrayList<ArrayList<float[]>> initCluster() {ArrayList<ArrayList<float[]>> cluster = new arraylist <arraylist <float [] >> (); for (int i = 0; i <k; i ++) {cluster.add (arraylist baru <float []> ());} return cluster;}/** * Hitung jarak antara dua titik * * @param element * point 1 * @param center * point 2 point 2 {float jarak = 0.0f; float x = elemen [0] - center [0]; float y = elemen [1] - tengah [1]; float z = x * x + y * y; jarak = (float) math.sqrt (z); jarak pengembalian;}/** * dapatkan posisi jarak minimum dalam set jarak * * @param jarak * jarak @ragam * mindistance (float [] jarak) {float mindistance = jarak [0]; int minlocation = 0; for (int i = 1; i <jarak. {minlocation = i;}}} return minlocation;}/*** inti, masukkan elemen saat ini di cluster terkait dengan pusat jarak minimum*/clusterset void privat () {float [] jarak = float baru [k]; untuk (int i = 0; i <DatasetLength; i ++) {untuk (int j = 0; J <) <DatasetLength; i ++) {untuk (int j = 0; jarak (dataset.get (i), center.get (j)); // system.out.println ("test2:"+"dataset ["+i+"], center ["+j+"], jarak ="+jarak [j]);} int minlocation = mindistance (jarak);/// System.out.println ("test3:"+"dataset ["+i+"], minlocation ="+minlocation); // System.out.println (); cluster.get(minLocation).add(dataSet.get(i));// Core, put the current element in the cluster related to the minimum distance center}}/** * Method to find the square of the error of two points* * @param element * Point 1 * @param center * Point 2 * @return Error square*/private float errorSquare(float[] element, float[] center) {float x = element[0] - tengah [0]; float y = elemen [1] - center [1]; float errsquare = x * x + y * y; return errsquare;}/** * Hitung jumlah kesalahan metode fungsi kriteria kuadrat */private void countrule () {float jcf = 0; untuk (int i = 0; i <cluster.size (); i ++) {for (int j = 0; j <cluster.get (i) .size (); j ++) {jcf+= errorsquare (cluster.get (i) .get (j), center.get (i));}} jc.add (jc); setNewCenter () {for (int i = 0; i <k; i ++) {int n = cluster.get (i) .size (); if (n! = 0) {float [] newCenter = {0, 0}; untuk (int j = 0; j <n; j ++) {newCenter [0] = cluster.get. cluster.get (i) .get (j) [1];} // Tetapkan rata -rata newenter [0] = newCenter [0]/ n; newCenter [1] = newCenter [1]/ n; center.set (i, newCenter);}}/ *** cetak data, uji** @param dataray* dataset* @par @parne printDataArray (arraylist <float []> dataarray, string dataarrayname) {for (int i = 0; i <dataarray.size (); i ++) {System.out.println ("print:" + DataArrayName + "[" + i + "] = {" + DataArray (i] [0] [0] [" + I +"] = {" + DataArray (i) (i) [0] [" + I + "] [iPeRay. "}");} System.out.println ("========================================= ============================================================ ");}/** * Metode Proses Inti Algoritma Kmeans */private void kmeans () {init (); // printDataArray (dataset, "initDataSet"); // printDataArray (tengah, "initcenter"); // Pengelompokan loop sampai kesalahan tetap tidak berubah sementara (true) {clusterset (); // for (int i = 0; i <cluster.size (); i ++) // {// printDataArray (cluster.get (i), "cluster ["+i+"]"); //} countrule (); // system.out.println ("count:"+"jc ["+m+"] ="+jc.get (m)); // System.out.println (); // Kesalahan tetap tidak berubah, pengelompokan diselesaikan jika (m! = 0) {if (jc.get (m) - jc.get (m - 1) == 0) {break;}} setNewCenter (); // printDataArray (tengah, "newcenter"); M ++; cluster.clear (); cluster = initcluster ();} // System.out.println ("Catatan: Waktu pengulangan: m ="+m); // output iterasi}/*** algoritma eksekusi*/public void execute () {starttime long. System.currentTeMillis (); System.out.printlnTime = System. System.currentTimeMillis (); System.out.println ("Kmeans Running Time =" + (Endtime - StartTime) + "MS"); System.out.println ("KMeans Ends"); System.out.println ();}}5. Deskripsi:
Kode spesifik ditemukan online, dan komentar ditambahkan dan sebagian dimodifikasi sesuai dengan pemahaman Anda sendiri. Jika komentarnya salah, saya berharap dapat memperbaikinya.
6. Tes
Paket org.test; import java.util.arraylist; impor org.algorithm.kmeans; kelas publik kmeanstest {public static void main (string [] args) {// inisialisasi objek kmean dan set kM = kM = new kmeans (10); arraylist <arraylist <float. float [] {1,2}); dataset.add (float baru [] {3,3}); dataset.add (float baru [] {3,4}); dataset.add (new float [] {5,6}); dataset.add (new float [] {8,9}); dataset. float [] {4,5}); dataset.add (float baru [] {6,4}); dataset.add (float baru [] {3,9}); dataset.add (new float [] {5,9}); dataset.add (new float [] {4,2}); dataset.add (new float [] {4,2}); dataset.add (new float [] {4,2}); dataset.add (new float [] {4,2}); dataset.add float [] {1,9}); dataset.add (float baru [] {1,9}); dataset.add (float baru [] {1,9}); dataset.add (new float [] {5,9}); dataset.add (new float [] {4,2}); dataset.add (new float [] {4,2}); dataset.add (new float [] {4,2}); dataset.add (new float [] {4,2}); dataset.add (new float [] {4,2}); dataset.add float [] {1,9}); dataset.add (float baru [] {1,9}); dataset.add (float baru [] {1,9}); dataset.add (new float [] {5,9}); dataset.add (new float [] {5,9}); dataset. float [] {4,2}); dataset.add (float baru [] {1,9}); dataset.add (float baru [] {7,8}); // atur dataset asli k.setDataSet (dataset); // jalankan ARRAYIT <) cluster = k.getCluster (); // Lihat hasilnya untuk (int i = 0; i <cluster.size (); i ++) {k.printdataArray (cluster.get (i), "cluster ["+i+"]");}}}Ringkasan: Kode tes telah dilewati. Hasil pengelompokan dilihat, dan hasilnya pada dasarnya memenuhi persyaratan. Apakah ada algoritma yang lebih akurat masih harus ditemukan. Praktik khusus perlu dieksplorasi
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang contoh kode implementasi versi Java dari algoritma pengelompokan K-Mean. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!