본문 바로가기

데이터 분석

Spark - K-means

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

클러스터링 알고리즘 분류


하드 클러스터링 - 각 데이터 포인트가 하나의 클러스터에 속함

▶ 소프트 클러스터링 - 각 데이터 포인트가 두개 이상의 클러스터에 속함





K-means 한계


클러스터의 크기가 다른 경우

▶클러스터의 밀도가 다른 경우

▶구형모양 등




K-평균

 

 ▶ 대표적인 하드 클러스터링 

 ▶ 데이터를 k개의 상호 배타적인 클러스터로 분할, 포인트에서 클러스터 센터까지의 거리에 따라  결정

 클러스터 수를 알고 있음

 대용량 데이터의 빠른 클러스터링

 






Spark MLlib 을 이용한 테스트


※Sample Data


0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2




Test Source


테스트 요약 : 데이터를 읽어서 2개의 클러스터로 나누고 각각의 포인트를 확인하고 샘플데이터의 영역 확인

● Sample Load
String
path = "data/mllib/kmeans_data.txt"; JavaRDD<String> data = jsc.textFile(path);



●데이터를 RDD로 변환

JavaRDD<Vector> parsedData = data.map( new Function<String, Vector>() { public Vector call(String s) { String[] sarray = s.split(" "); double[] values = new double[sarray.length]; for (int i = 0; i < sarray.length; i++) { values[i] = Double.parseDouble(sarray[i]); } return Vectors.dense(values); } } );



● 반복 알고리즘에 대해 데이터 캐쉬로 속도 향상

parsedData.cache();



● 클러스터 개수와 반복 횟수 정의 int numClusters = 2; int numIterations = 20; KMeansModel clusters = KMeans.train(parsedData.rdd(), numClusters, numIterations);



● 클러스터 센터 출력

for (Vector center: clusters.clusterCenters()) { System.out.println(" " + center); }


=> 결과값 [0.1,0.1,0.1] / [9.099999999999998,9.099999999999998,9.099999999999998]



가장 가까운 센터와의 제곱 거리의 합

double cost = clusters.computeCost(parsedData.rdd());


=> 결과값 0.11999999999994547

=> 실제로 몇 개의 클러스터로 나눌지 알 수 없으므로 여러 가지 값의 K로 클러스터 간의 거리가 더이상 줄어들지 않을 때까지

시도해 보는 것으로 이때 사용



● 클러스터 포함영역 확인

System.out.println( clusters.predict(parsedData).collect() );


=> [0, 0, 0, 1, 1, 1]

샘플데이터는 총 6개 Row로 0.0, 0.0, 0.0 의 포함된 영역은 0이며 다음 값들의 영역 순으로 출력




'데이터 분석' 카테고리의 다른 글