1. Введение
Алгоритм кластеризации K-среднего сначала выбирает K-объекты в качестве начального центра кластеризации. Затем рассчитывается расстояние между каждым объектом и центром каждого кластера семян, и каждый объект назначается в центр кластера, ближайший к нему. Кластерный центр и объекты, назначенные им, представляют кластер. Как только все объекты распределяются, кластерный центр каждого кластера пересчитывается на основе существующих объектов в кластере. Этот процесс будет повторяться до тех пор, пока не будет выполнено определенное условие завершения. Условием завершения может быть то, что объекты NO (или минимальное число) переназначены в разные кластеры, нет (или минимальное число) кластерных центров снова изменяется, и сумма квадратных ошибок на локальном уровне минимальна.
2. Что такое кластеризация
Кластеризация - это процесс сортировки и организации членов данных, которые похожи в определенных аспектах. Кластеризация - это технология для обнаружения этой внутренней структуры. Технология кластеризации часто называют неконтролируемым обучением.
3. Что такое кластеризация K-Mean
Кластеризация K-Means является наиболее известным алгоритмом кластеризации разделов, и благодаря своей простоте и эффективности она стала наиболее широко используемым из всех алгоритмов кластеризации. Учитывая набор точек данных и требуемое количество кластеров k, k указывается пользователем, а алгоритм K-среднего многократно делит данные на k-кластеры в соответствии с определенной функцией расстояния.
4. Реализация
Код Java выглядит следующим образом:
пакет org.algorithm; import java.util.arraylist; import java.util.random;/*** k-mean-кластеризационный алгоритм*/public class kmeans {private int k; // Сколько кластеров разделено на частные данные; ArrayList <float []> DataSet; // DataSet Linked List Private ArrayList <float []> center; // Центр связанного списка Private ArrayList <ArrayList <float []> Cluster; // Cluster Private ArrayList <float> jc; // Сумма квадратных ошибок, более близкий k - это DataSetLende, по ошибке, погрешной случайной случайной; DataSet*/public void setDataSet (arraylist <flot []> dataet) {this.dataset = dataSet;}/*** Получить группировку результатов** @return Result Set*/public arraylist <arraylist <flot [] >> getCluster () {return Cluster;}/** ** Constructor, Comvelcome the Numbers at at dividd at at at at.palyd @chumbded at at. Кластеры, если k <= 0, установите в 1, если k больше, чем длина источника данных, установите на длину источника данных*/public kmeans (int k) {if (k <= 0) {k = 1;} this.k = k;}/***Инициализация*/private void init () {m = 0; random = random = random (); ул. 0) {initDataSet ();} dataSetLength = dataSet.size (); if (k> dateTlength) {k = dataSetLength;} center = initCenters (); cluster = initCluster (); JC = новый ArrayList <float> ();}/**, если вызыв не инициализирован. initDataSet() {dataSet = new ArrayList<float[]>();// where {6,3} is the same, so the error of dividing datasets of length 15 into 14 clusters and 15 clusters is 0 float[][] dataSetArray = new float[][] { { 8, 2 }, { 3, 4 }, { 2, 5 }, { 4, 2 }, { 7, 3}, {6, 2}, {4, 7}, {6, 3}, {5, 3}, {6, 3}, {6, 9}, {1, 6}, {3, 9}, {4, 1}, {8, 6}}; для (int i = 0; {dataSet.add (dataSetarray [i]);}}/*** Инициализируйте список центральных ссылок данных, и существует столько же центральных точек, сколько кластеров разделены на*** @return Center Point*/Private ArrayList <float []> initCenters () {ArrayList <float] center = new ArrayList <] float [] intemporm int [int int int int [int int int [] int [int int int [] int [int int int [] int [] int int [] in int []; = random.nextint (dateTlength); Randoms [0] = temp; for (int i = 1; i <k; i ++) {flag = true; while (flag) {temp = random.nextint (dateTlength); int j = 0; // Я не уверен, что для петли для петли J не может добавить 1 // для (j = 0; if (temp == Randoms [j]); // { // перерыв; //} //} while (j <i) {if (temp == Randoms [j]) {break;} j ++;} if (j == i) {flag = false;}} Randoms [i] = temp;} // Проверка ситуации генерации случайных чисел // for (int i = 0; System.out.println ("test1: Randoms ["+i+"] ="+Randoms [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 <] float []> ());} return Cluster;}/** * Рассчитайте расстояние между двумя точками * * @param element * point 1 * @param center * point 2 * @return. 0.0f; float x = element [0] - Center [0]; float y = элемент [1] - Центр [1]; float z = x * x + y * y; расстояние = (float) math.sqrt (z); return Distump {float Mindistance = Distance [0]; int minlocation = 0; for (int i = 1; i <distance.length; i ++) {if (distance [i] <mindistance) {mindistance = distance [i]; minlocation = i;} else if (i] == mindistance) // Если равна, возвращайте случайное положение. i;}}} return minlocation;}/*** core, положите текущий элемент в кластер, связанный с минимальным центром расстояний*/private void clasterset () {float [] Distance = New Float [k]; for (int i = 0; i <dataetLength; i ++) {для (int j = 0; j <k; j ++) {distance) {in) (i) {in) {int, j = 0; center.get (j)); // System.out.println ("test2:"+"DataSet ["+i+"], Center ["+j+"], Distance ="+Distance [j]);} int minlocation = mindistance (расстояние); // 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] - Центр [0]; float y = element [1] - Center [1]; float errsquare = x * x + y * y; return errsquare;}/** * Рассчитайте сумму ошибки квадратной метода функции критерия */private void countrule () {float jcf = 0; for (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 (jcf); setNewCenter () {for (int i = 0; i <k; i ++) {int n = cluster.get (i) .size (); if (n! = 0) {float [] newCenter = {0, 0}; для (int j = 0; j <n; j ++) {newCenter [0]+= = grate (i). 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) {for (int i = 0; i <dataarray.size (); i ++) {System.out.println ("print:" + dataarrayname + "[ + i +"] = {" + dataarray.get (i) [0] +", " + dataRay. "}");} System.out.println ("===================================================================== ===================================================================== * Метод основного процесса алгоритма Kmeans */private void kmeans () {init (); // printDataarray (набор данных, "initDataset"); // printDataarray (центр, "initCenter"); // Цикл группировка до тех пор, пока ошибка не останется неизменной, в то время как (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 (); // Ошибка остается неизменной, группировка завершается, если (m! = 0) {if (jc.get (m) - jc.get (m - 1) == 0) {break;}} setNewCenter (); // printDataArray (центр, "newCenter"); M ++; cluster.clear (); cluster = initCluster ();} // system.out.println («Примечание: время повторения: m ="+m); // выходные итерации}/**** Алгоритм выполнения*/public void execute () {long starttime = System.currentTimeMillis (); System.out.println ("kmeans yound wears"); System.currentTimeMiLsis (); System.out.println ("kmeans runting time =" + (endtime - starttime) + "ms"); system.out.println ("kmeans ends"); System.out.println ();}}5. Описание:
Конкретный код найден в Интернете, и комментарии добавляются и частично изменены в соответствии с вашим собственным пониманием. Если комментарий неверен, я надеюсь исправить его.
6. тест
Package org.test; Import java.util.arraylist; import org.algorithm.kmeans; public class kmeanstest {public static void main (string [] args) {// инициализировать объект Kmean и установить K to 10 Kmeans k = new Kmeans (10); ArrayList <] dataSet = new ArrameList <] (] rateList <] (] rateList <] (] rateList <] (] rateList <] (] ratelist <] (] rateList <] (] rateList <]. float [] {1,2}); dataSet.add (new Float [] {3,3}); dataSet.add (new Float [] {3,4}); dataSet.Add (new Float [] {5,6}); float [] {4,5}); dataSet.Add (new Float [] {6,4}); dataSet.Add (new Float [] {3,9}); DataSet.Add (New Float [] {5,9}); float [] {1,9}); dataSet.add (new Float [] {1,9}); dataSet.Add (new Float [] {1,9}); DataSet.Add (New Float [] {5,9}); DataSet.Add (новый float [] {4,2); float [] {1,9}); dataSet.Add (new Float [] {1,9}); dataSet.Add (new Float [] {1,9}); dataSet.Add (new Float [] {5,9}); DataSet.Add (New Float [] {5,9}); float [] {4,2}); dataSet.add (new Float [] {1,9}); DataSet.Add (New Float [] {7,8}); // Установить исходный набор данных k.setDataset (dataSet); // Execute the Algorithm k.execute ();//get -resulting arrayList <] arrayList <] arrayList <]; cluster = k.getCluster (); // Просмотреть результат для (int i = 0; i <cluster.size (); i ++) {k.printdataarray (cluster.get (i), "cluster ["+i+"]");}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Резюме: тестовый код был пройден. Результаты кластеризации были просмотрены, и результаты в основном соответствовали требованиям. Есть ли более точные алгоритмы, еще предстоит обнаружить. Необходимо изучить конкретные практики
Суммировать
Выше приведено все содержимое этой статьи о примере Code Code версии Java версии k-среднего алгоритма кластеризации. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!