1. บทนำ
อัลกอริทึมการจัดกลุ่ม k-mean ครั้งแรกสุ่มเลือกวัตถุ K เป็นศูนย์การจัดกลุ่มเริ่มต้น ระยะห่างระหว่างแต่ละวัตถุและศูนย์กลางของแต่ละกลุ่มเมล็ดจะถูกคำนวณและแต่ละวัตถุจะถูกกำหนดให้กับศูนย์คลัสเตอร์ที่อยู่ใกล้ที่สุด ศูนย์คลัสเตอร์และวัตถุที่กำหนดให้เป็นตัวแทนของคลัสเตอร์ เมื่อวัตถุทั้งหมดได้รับการจัดสรรศูนย์กลางของคลัสเตอร์ของแต่ละคลัสเตอร์จะถูกคำนวณใหม่ตามวัตถุที่มีอยู่ในคลัสเตอร์ กระบวนการนี้จะถูกทำซ้ำจนกว่าจะมีเงื่อนไขการเลิกจ้างที่แน่นอน เงื่อนไขการเลิกจ้างอาจเป็นไปได้ว่าวัตถุไม่มี (หรือจำนวนขั้นต่ำ) ถูกกำหนดใหม่ไปยังกลุ่มที่แตกต่างกันไม่มี (หรือจำนวนขั้นต่ำ) ของศูนย์คลัสเตอร์เปลี่ยนอีกครั้งและผลรวมของข้อผิดพลาดกำลังสองน้อยที่สุด
2. การจัดกลุ่มคืออะไร
การจัดกลุ่มเป็นกระบวนการเรียงลำดับและการจัดระเบียบสมาชิกข้อมูลที่มีความคล้ายคลึงกันในบางแง่มุม การจัดกลุ่มเป็นเทคโนโลยีที่ค้นพบโครงสร้างภายในนี้ เทคโนโลยีการจัดกลุ่มมักเรียกว่าการเรียนรู้ที่ไม่ได้รับการดูแล
3. การจัดกลุ่ม k-mean คืออะไร
K-Mean Clustering เป็นอัลกอริทึมการจัดกลุ่มพาร์ติชันที่มีชื่อเสียงที่สุดและเนื่องจากความเรียบง่ายและประสิทธิภาพมันจึงกลายเป็นสิ่งที่ใช้กันอย่างแพร่หลายที่สุดในอัลกอริทึมการจัดกลุ่มทั้งหมด เมื่อกำหนดชุดข้อมูลและจำนวนกลุ่มที่ต้องการ K, K ถูกระบุโดยผู้ใช้และอัลกอริทึม k-mean จะแบ่งข้อมูลเป็นกลุ่ม K ซ้ำ ๆ ตามฟังก์ชันระยะทางที่แน่นอน
4. การดำเนินการ
รหัส Java มีดังนี้:
แพ็คเกจ org.algorithm; นำเข้า java.util.arraylist; นำเข้า java.util.random;/*** k-mean การจัดกลุ่มอัลกอริทึม*/คลาสสาธารณะ KMeans arraylist <float []> dataset; // ชุดข้อมูลที่เชื่อมโยงรายการส่วนตัว arraylist <float []> center; // ศูนย์เชื่อมโยงรายการส่วนตัว Arraylist <arraylist <float []> คลัสเตอร์; // คลัสเตอร์ส่วนตัว จัดกลุ่ม** @param ชุดข้อมูล*/โมฆะสาธารณะ setDataset (arraylist <float []> ชุดข้อมูล) {this.dataset = dataset;}/*** รับการจัดกลุ่มผลลัพธ์** @return set*/arraylist <arraylist < หาร** @param k* จำนวนกลุ่มถ้า k <= 0 ตั้งค่าเป็น 1 ถ้า k มากกว่าความยาวของแหล่งข้อมูลตั้งค่าเป็นความยาวของแหล่งข้อมูล*/kmeans สาธารณะ (int k) {ถ้า (k <= 0) {k = 1;} this.k = k;}/*** || dataset.size () == 0) {initDataSet ();} dataSetLength = dataSet.size (); ถ้า (k> dataSetLength) {k = datasetLength;} center = initcenters (); ชุดข้อมูลถูกใช้*/โมฆะส่วนตัว initDataSet () {dataSet = new ArrayList <float []> (); // โดยที่ {6,3} เหมือนกันดังนั้นข้อผิดพลาดของการแบ่งชุดข้อมูลที่มีความยาว 15 เป็น 14 กลุ่มและ 15 {{{{{{{{{{{{{{{{{{{{{{{ }, {4, 2}, {7, 3}, {6, 2}, {4, 7}, {6, 3}, {5, 3}, {6, 3}, {6, 9}, {1, 6}, {3, 9}, {4, 1} DataSetArray.length; arraylist <float []> (); int [] randoms = new int [k]; ธงบูลีน; int temp = random.nextint (dataSetLength); randoms [0] = temp; สำหรับ (int i = 1; i <k; i ++) {flag = true; ไม่สามารถเพิ่ม 1 // สำหรับ (j = 0; j <i; ++ j) // {// ถ้า (temp == randoms [j]); // { // หยุดพัก; //} //} ในขณะที่ (j <i) {if (temp == randoms [j]) {break;} j ++;} ถ้า (j == i) {flag = false;}} randoms [i] = temp;} // ทดสอบสถานการณ์การสร้างจำนวนสุ่ม // สำหรับ (int i = 0; System.out.println ("test1: randoms ["+i+"] ="+randoms [i]); //} // system.out.println (); สำหรับ (int i = 0; i <k; i ++) {center.add (dataSet.get (randoms [i])); // สร้างการเริ่มต้นศูนย์เชื่อมโยง} return center;}/*** ชุดเริ่มต้นเริ่มต้น** @@Return กลุ่มข้อมูลว่าง {arraylist <arraylist <float [] >> คลัสเตอร์ = new ArrayList <arraylist <float [] >> (); สำหรับ (int i = 0; i <k; i ++) {cluster.add (จุดใหม่ * จุด * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @return ระยะทาง */ระยะลอยส่วนตัว (องค์ประกอบลอย [], ลอย [] กลาง) {ระยะลอย = 0.0f; ลอย x = องค์ประกอบ [0] - กึ่งกลาง [0]; ลอย y = องค์ประกอบ [1] - กลาง [1]; ลอย z = x * x + y * y; ระยะทาง* อาร์เรย์ระยะทาง* @กลับมาตำแหน่งของระยะทางต่ำสุดในอาร์เรย์ระยะทาง*/ความคิดส่วนตัว (ระยะทางลอย []) {ลอยความคิด = ระยะทาง [0]; int minlocation = 0; สำหรับ (int i = 1; i <ระยะทางความยาว; i ++) {ถ้า (ระยะทาง Mindistance) // ถ้าเท่ากันให้ส่งคืนตำแหน่งสุ่ม {if (random.nextint (10) <5) {minLocation = i;}}} ส่งคืน minLocation;}/*** core ใส่องค์ประกอบปัจจุบันในคลัสเตอร์ที่เกี่ยวข้องกับระยะทางต่ำสุด* (int j = 0; j <k; j ++) {ระยะทาง [j] = ระยะทาง (dataset.get (i), center.get (j)); // system.out.println ("test2:"+"ชุดข้อมูล ["+i+"], center ["+j+"], ระยะทาง ="+ระยะทาง System.out.println ("test3:"+"ชุดข้อมูล ["+i+"], minLocation ="+minLocation); // system.out.println (); cluster.get (minLocation) .add (dataset.get (i)); // core, ใส่องค์ประกอบปัจจุบันในคลัสเตอร์ที่เกี่ยวข้องกับศูนย์ระยะไกลต่ำสุด}}/** * วิธีการค้นหาสี่เหลี่ยมจัตุรัสของข้อผิดพลาดของสองจุด * * @param องค์ประกอบ float [จุดลอยตัว] center [0]; float y = องค์ประกอบ [1] - center [1]; float errsquare = x * x + y * y; return errsquare;}/** * คำนวณผลรวมข้อผิดพลาดของวิธีการใช้งานเกณฑ์กำลังสอง */โมฆะส่วนตัว () {float jcf = 0; สำหรับ (int i = 0; i <cluster.size (); i ++) {สำหรับ (int j = 0; j <cluster.get (i) .size (); j ++) {jcf+= errorsquare (cluster.get (i) .get (J) setNewCenter () {สำหรับ (int i = 0; i <k; i ++) {int n = คลัสเตอร์ (i) .size (); ถ้า (n! = 0) {float [] newCenter = {0, 0}; สำหรับ (int j = 0; j <n; j ++) cluster.get (i) .get (j) [1];} // ตั้งค่า newCenter เฉลี่ย [0] = newCenter [0]/ n; newCenter [1] = newCenter [1]/ n; center.set (i, newCenter); printDataArray (arrayList <float []> dataArray, String dataArrayName) {สำหรับ (int i = 0; i <dataArray.size (); i ++) {system.out.println ("พิมพ์:" + dataArrayName + "[" + i + "] = {" "}");} system.out.println ("===================================================== - * KMEANS อัลกอริทึมวิธีการกระบวนการ */โมฆะส่วนตัว kMeans () {init (); // printDataArray (ชุดข้อมูล, "initDataset"); // printDataArray (ศูนย์ "initCenter"); // การจัดกลุ่มลูปจนกว่าข้อผิดพลาดจะไม่เปลี่ยนแปลงในขณะที่ (จริง) {Clusterset (); // สำหรับ (int i = 0; i <cluster.size (); i ++) // {// printDataArray (cluster.get (i), "คลัสเตอร์ ["+i+"]"); //} countrule (); // system.out.println ("นับ:"+"jc ["+m+"] ="+jc.get (m)); // system.out.println (); // ข้อผิดพลาดยังคงไม่เปลี่ยนแปลงการจัดกลุ่มจะเสร็จสมบูรณ์ถ้า (m! = 0) {ถ้า (jc.get (m) - jc.get (m - 1) == 0) {break;}} setNewCenter (); // printDataArray (กลาง "newCenter"); M ++; Cluster.Clear (); cluster = initCluster ();} // system.out.println ("หมายเหตุ: เวลาของการทำซ้ำ: m ="+m); // output iterations}/*** อัลกอริทึมการดำเนินการ*/โมฆะสาธารณะดำเนินการ () {starttime = system.currentTimeMillis (); System.currentTimeMillis (); System.out.println ("kmeans เวลาทำงาน =" + (endtime - starttime) + "ms"); system.out.println ("kmeans สิ้นสุด"); system.out.println ();}}}5. คำอธิบาย:
พบรหัสเฉพาะทางออนไลน์และมีการเพิ่มความคิดเห็นและแก้ไขบางส่วนตามความเข้าใจของคุณเอง หากความคิดเห็นไม่ถูกต้องฉันหวังว่าจะแก้ไข
6. ทดสอบ
แพ็คเกจ org.test; นำเข้า java.util.arraylist; นำเข้า org.algorithm.kmeans; คลาสสาธารณะ kmeanstest {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {// เริ่มต้นวัตถุ kmean และตั้ง k ถึง 10 kmeans k = kmeans ใหม่ (10); arrayList <float []> (); dataSet.add (ใหม่ลอย [] {1,2}); dataSet.add (ใหม่ลอย [] {3,3}); dataset.add (ใหม่ลอย [] {3,4}); dataSet.add float [] {8,9}); dataset.add (ใหม่ลอย [] {4,5}); dataSet.add (ใหม่ลอย [] {6,4}); dataset.add (ใหม่ลอย [] {3,9}); dataSet.add float [] {4,2}); dataset.add (ใหม่ลอย [] {1,9}); dataSet.add (ใหม่ลอย [] {1,9}); dataset.add (ใหม่ลอย [] {1,9}); dataSet.add float [] {4,2}); dataset.add (ใหม่ลอย [] {1,9}); dataSet.add (ใหม่ลอย [] {1,9}); dataset.add (ใหม่ลอย [] {1,9}); dataSet.add float [] {5,9}); dataset.add (ใหม่ลอย [] {4,2}); dataSet.add (ใหม่ลอย [] {1,9}); dataset.add (ใหม่ลอย [] {7,8}); ผลการจัดกลุ่ม arraylist <arraylist <float [] >> คลัสเตอร์ = k.getCluster (); // ดูผลลัพธ์สำหรับ (int i = 0; i <cluster.size (); i ++) {k.printdataarrayสรุป: รหัสทดสอบได้ผ่านไปแล้ว ดูผลลัพธ์การจัดกลุ่มและผลลัพธ์โดยทั่วไปเป็นไปตามข้อกำหนด ไม่ว่าจะมีอัลกอริทึมที่แม่นยำมากขึ้นหรือไม่ ต้องมีการสำรวจแนวทางปฏิบัติเฉพาะ
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับตัวอย่างรหัสการใช้งาน Java รุ่นของอัลกอริทึมการจัดกลุ่ม k-mean ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!