1. 소개
k-mean 클러스터링 알고리즘은 먼저 최초 클러스터링 센터로 k 객체를 무작위로 선택합니다. 그런 다음 각 객체와 각 시드 클러스터의 중앙 사이의 거리가 계산되고 각 객체가 클러스터 센터에 가장 가까운 클러스터 센터에 할당됩니다. 클러스터 센터와 그들에게 할당 된 객체는 클러스터를 나타냅니다. 모든 객체가 할당되면 각 클러스터의 클러스터 중심은 클러스터의 기존 객체에 따라 다시 계산됩니다. 이 과정은 특정 종료 조건이 충족 될 때까지 반복됩니다. 종료 조건은 NO (또는 최소 숫자) 객체가 다른 클러스터로 재 할당되며, 클러스터 센터의 NO (또는 최소 수)가 다시 변경되며 제곱 오류의 합은 로컬로 최소화됩니다.
2. 클러스터링이란 무엇입니까?
클러스터링은 특정 측면에서 유사한 데이터 구성원을 정렬하고 구성하는 과정입니다. 클러스터링은이 내부 구조를 발견하는 기술입니다. 클러스터링 기술을 종종 감독되지 않은 학습이라고합니다.
3. K-Mean 클러스터링이란 무엇입니까?
K- 평균 클러스터링은 가장 유명한 파티션 클러스터링 알고리즘이며 단순성과 효율성으로 인해 모든 클러스터링 알고리즘 중에서 가장 널리 사용되었습니다. 데이터 포인트 세트와 필요한 클러스터 k, k는 사용자가 지정하고 K-Mean 알고리즘은 특정 거리 함수에 따라 데이터를 K 클러스터로 반복적으로 나눕니다.
4. 구현
Java 코드는 다음과 같습니다.
패키지 org.algorithm; import java.util.arraylist; import java.util.random;/*** k-mean 클러스터링 알고리즘*/public class kmeans {private int k; // 몇 개의 클러스터가 개인 INT M으로 나뉘어져 있는지; // 데이터 세트의 DataSetlength; ArrayList <float []> Dataset; // DataSet LINGHED LIST LIST PRIVATERRAYLIST <float []> Center; // 센터 링크 목록 개인 ArrayList <arrayList <float []> Cluster; // 클러스터 개인 ArrayList <Float> jc; // Cleseer K는 DataSetlengrenge의 소규모로 설정되어 있습니다. @param dataset*/public void setdataset (arraylist <float []> dataset) {this.dataset = dataset;}/*** 결과 그룹을 얻습니다** @return 결과 세트*/public arraylist <float [] >> getCluster () {return Cluster** *** Constructor, Pass in the Nove Clus wit * k <= 0이면 1으로 설정된 클러스터 수, k는 데이터 소스의 길이보다 큰 경우 데이터 소스의 길이*/public kmeans (int k) {if (k <= 0) {k = 1;} this.k = k;}/*** 초기화*/private void init () {m = 0; random = new random (); if (dataset = null |); DataSet.size () == 0) {initDataset ();} dataSetLength = DataSet.size (); if (k> dataSetLength) {k = dataSetLength;} center = initCenters (); cluster = initCluster (); jc = new arraylist <float> (); 사용*/private void initDataset () {dataSet = new ArrayList <float []> (); // 여기서 {6,3}는 동일하므로 길이 15의 데이터 세트를 14 개의 클러스터로 나누는 오류는 0 float [] [] [] dataSetarray = new float [] [] [] {8, 2}, {3, 4}, 4},} }, {7, 3}, {6, 2}, {4, 7}, {6, 3}, {5, 3}, {6, 3}, {6, 9}, {1, 6}, {3, 9}, {4, 1}, {8, 6}}; {dataSet.Add (DataSetArray [i]);}}/*** 중앙 데이터 링크 목록을 초기화하고 클러스터가** @return center point set*/private arraylist []> initcenters () {arraylist <float []> center = new arrayList <> (); int []; int []; int []; int []; int []; flag; int temp = random.nextint (datasetlength); 랜덤 [0] = temp; for (int i = 1; i <k; i ++) {flag = true; while (flag) {temp = random.nextint (dataSetlength); int j = 0; // j = 0; if (temp == randoms [j]); // { // 부서지다; //} //} while (j <i) {if (temp == randoms [j]) {break;} j ++;} if (j == i) {flag = false;}} random [i] = temp;} // (int i = 0; i <k; i ++) // {// {// {// System.out.println ( "test1 : 랜덤 ["+i+"] ="+randoms [i]); //} // system.out.println (); for (int i = 0; i <k; i ++) {center.add (dataset.get (randoms [i]); // 초기화 센터 링크 생성} return center;}/*** 초기화 클러스터 세트** @return k 클러스터*/private arraylist <float [] >> initlist <forectlist () {arraylist <flate <fore cluster = new ArrayList <arrayList <float [] >> (); for (int i = 0; i <k; i ++) {cluster.add (new arrayList <float []> ());} 반환 클러스터;}/** * 두 지점 사이의 거리를 계산합니다 * @Param 요소 * @Param 중심 * @Param 거리 */Private Distount (floT) {float 거리 = 0.0f; float x = element [0] - Center [0]; float y = element [1] - 중심 [1]; float = (float) math.sqrt (z); 반환 거리;}/** * Distances 세트에서 최소 거리의 위치를 얻습니다. Mindistance (float [] 거리) {float Mindistance = 거리 [0]; int minlocation = 0; for (int i = 1; i <distone.length; i ++) {if (거리 [i] <mindistance) {mindistance = 거리 [i]; minlocation = i;} else if (disting [i] == mindistance) // if rendit a renight a wiming a wember a wember at (ministance = <mindistance) {ministance = distonge [i]; minlocation = i; {minlocation = i;}}} return minlocation;}/*** 코어, 최소 거리 중심과 관련된 클러스터에 전류 요소를 넣습니다.*/private void clusterset () {float [] distone = new float [k]; for (int i = 0; i <dataSetlength; i ++) {(int j = 0; DITASET.GET (i), center.get (j)); // system.out.println ( "test2 :"+"dataSet ["+i+"], center ["+j+"], 거리 ="+거리 [j]);} int minlocation = mindistance (거리); // System.out.println ( "test3 :"+"dataset ["+i+"], minlocation ="+minlocation); // system.out.println (); cluster.get (minlocation) .add (dataset.get (i)); // 코어, 최소 거리 센터와 관련된 클러스터에 현재 요소를 넣으려면 두 포인트의 오류의 제곱을 찾기 위해 * @param 요소 * 포인트 1 * @param center * @return 오류 정사각형 */private float errorsquare (float []) {float x = x = x = x. Center [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; setNewCenter () {for (int i = 0; i <k; i ++) {int n = cluster.get (i) .size (); if (n! = 0) {float [] newcenter = {0, 0}; for (int j = 0; cluster.get (i) .get (j) [1];} // 평균 NewCenter [0] = NewCenter [0]/ n; NewCenter [1] = NewCenter [1]/ n; center.set (i, newCenter);}}}/ *** 인쇄** @param dataArray* dataSet*/ problameD*/ problaMArrayname*/ problaD ARRAY printDataArray (arrayList <float []> dataArray, String DataArrayName) {for (int i = 0; i <dataArray.size (); i ++) {system.out.println ( "print :" + dataArrayName + "[" + i + "=" + dataArray.get (i) [0] + " + dataArray (i) [i) [i) [i) [i) [i) [0] +" "}");} system.out.println ( "====================================== = 일반 * kmeans 알고리즘 코어 프로세스 방법 */private void kmeans () {init (); // printDataArray (DataSet, "initDataset"); // printDataArray (Center, "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 (Center, "NewCenter"); m ++; cluster.clear (); cluster = initcluster ();} // system.out.println ( "참고 : 반복 시간 : m ="+m); // output iterations}/*** execution algorithm*/public void execute () {long starttime = system.currentTimeMillis (); kmeans (kmeans starns); System.CurrentTimeMillis (); System.out.println ( "kmeans running time =" + (endtime -starttime) + "ms"); system.out.println ( "kmeans end"); System.out.println ();}}5. 설명 :
특정 코드는 온라인으로 찾을 수 있으며 의견이 추가되고 자신의 이해에 따라 부분적으로 수정됩니다. 댓글이 잘못되면 수정하고 싶습니다.
6. 테스트
패키지 org.test; import java.util.arraylist; import org.algorithm.kmeans; public class kmeanstest {public static void main (string [] args) {// kmean 객체를 초기화하고 10kmeans k = new Kmeans (10); arraylist <> dataset = new ArrayList <float []> (); DataSet.add (new float [] {1,2}); DataSet.Add (new float [] {3,3}); DataSet.Add (new float [] {3,4}); DataSet.Add (new float [] {5,6}); DataSet.Add (new float [] {8,9}); dataset.add (new float [] {4,5}); dataset.add (new float [] {6,4}); dataset.add (new float [] {3,9}); dataset.add (new float [] {5,9}); dataset.add (new float [] {4,2}); dataset.add (new 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 [] {4,2}); dataset.add (new 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}); dataset.add (new float [] {4,2}); dataset.add (new float [] {1,9}); dataSet.add (new float [] {7,8}); // 원래 데이터 세트 K.SetDataset (DataSet); result arraylist <arraylist <float [] >> cluster = k.getCluster (); // 결과를 봅니다 (int i = 0; i <cluster.size (); i ++) {k.printdataArray (cluster.get (i), "cluster ["+i+"]")}}요약 : 테스트 코드가 통과되었습니다. 클러스터링 결과가 보였고 결과는 기본적으로 요구 사항을 충족했습니다. 더 정확한 알고리즘이 있는지 여부는 여전히 발견됩니다. 특정 관행을 탐색해야합니다
요약
위는 K-Mean 클러스터링 알고리즘의 Java 버전 구현 코드 예제에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!