계층적 군집화는 결과적으로 좋은 나무를 주지만 몇 가지 단점이 있다. 트리 뷰는 추가 작업 없이 데이터를 별개의 그룹으로 분할하지 않으며, 알고리즘은 매우 계산적으로 집약적이다. 모든 항목 쌍 간의 관계를 계산한 다음 항목이 병합될 때 다시 계산해야 하기 때문에, 알고리즘은 매우 큰 데이터 세트에서 천천히 실행될 것이다.


클러스터링의 다른 방법은 K-평균 클러스터링이다. 이러한 유형의 알고리즘은 얼마나 많은 개별 클러스터를 생성해야 하는지를 미리 알려주기 때문에 계층적 클러스터링과는 상당히 다르다. 알고리즘은 데이터의 구조에 기초하여 군집 크기를 결정한다.


K-평균 군집화는 k가 임의로 배치된 중심(군집 중심을 나타내는 공간의 점)에서 시작하여 모든 항목을 가장 가까운 곳에 할당한다. 할당 후, 중앙분리대는 자신에게 할당된 모든 노드의 평균 위치로 이동되며, 할당은 다시 실행된다. 이 프로세스는 할당 변경이 멈출 때까지 반복된다. 그림 3-5는 5개 항목과 2개 클러스터에 대해 실행 중인 이 프로세스를 보여준다.


첫 번째 프레임에서는 두 개의 중심선(암흑원 표시)이 무작위로 배치된다. 프레임 2는 각 항목이 가장 가까운 중심부에 할당됨을 보여준다. 이 경우 A와 B는 상단 중심부에 할당되고 C, D, E는 하단 중심부에 할당된다. 세 번째 프레임에서 각 중심은 할당된 항목의 평균 위치로 이동되었다. 과제를 다시 계산해 보면, C는 이제 상단 중심부에 더 가깝고, D와 E는 하단 중심부에 가장 가깝게 남아 있는 것으로 나타났다. 따라서 한 군집에서는 A, B, C, 다른 군집에서는 D, E로 최종 결과에 도달한다.


K-평균 군집화를 수행하는 기능은 계층적 클러스터링 알고리즘과 동일한 데이터 행과 발신자가 반환하고자 하는 클러스터 수(k)를 함께 사용한다. 


import random

def kcluster(rows,distance=pearson,k=4):

 # Determine the minimum and maximum values for each point

 ranges=[(min([row[i] for row in rows]),max([row[i] for row in rows]))

 for i in range(len(rows[0]))]

 # Create k randomly placed centroids

 clusters=[[random.random( )*(ranges[i][1]-ranges[i][0])+ranges[i][0]

 for i in range(len(rows[0]))] for j in range(k)]

 lastmatches=None

 for t in range(100):

 print 'Iteration %d' % t

 bestmatches=[[] for i in range(k)]

 # Find which centroid is the closest for each row

 for j in range(len(rows)):

 row=rows[j]

 bestmatch=0

 for i in range(k):

 d=distance(clusters[i],row)

 if d<distance(clusters[bestmatch],row): bestmatch=i

 bestmatches[bestmatch].append(j)

 # If the results are the same as last time, this is complete

 if bestmatches==lastmatches: break

 lastmatches=bestmatches

# Move the centroids to the average of their members

 for i in range(k):

 avgs=[0.0]*len(rows[0])

 if len(bestmatches[i])>0:

 for rowid in bestmatches[i]:

 for m in range(len(rows[rowid])):

 avgs[m]+=rows[rowid][m]

 for j in range(len(avgs)):

 avgs[j]/=len(bestmatches[i])

 clusters[i]=avgs

 return bestmatches


이 코드는 임의로 각 변수의 범위 내에 군집 집합을 생성한다. 반복할 때마다 행은 각각 중심점 중 하나에 할당되며, 중심점 데이터는 모든 할당자의 평균으로 업데이트된다. 할당이 이전과 동일하면 프로세스가 종료되고 각각 클러스터를 나타내는 k 목록이 반환된다. 최종 결과를 도출하는 데 걸리는 반복 횟수는 계층적 클러스터링에 비해 상당히 적다.


이 함수는 시작할 때 무작위 중심체를 사용하기 때문에 반환되는 결과의 순서는 거의 항상 다를 것이다. 또한 클러스터의 내용은 중심부의 초기 위치에 따라 다를 수 있다.


블로그 데이터 세트에서 이 기능을 사용해 볼 수 있다. 계층적 클러스터링보다 훨씬 빠르게 실행되어야 한다.


>> reload(clusters)

>> kclust=clusters.kcluster(data,k=10)

Iteration 0

...

>> [rownames[r] for r in k[0]]

['The Viral Garden', 'Copyblogger', 'Creating Passionate Users', 'Oilman',

'ProBlogger Blog Tips', "Seth's Blog"]

>> [rownames[r] for r in k[1]]

etc..


이제 kclust는 각 클러스터에 대한 ID 목록을 포함하고 있다. k 값이 다른 클러스터링을 사용해 보고 결과에 어떤 영향을 미치는지 확인하십시오.


기본 설정 클러스터

소셜 네트워킹 사이트에 대한 관심이 증가하고 있는 것에 대한 가장 좋은 점 중 하나는 빅 데이터 세트가 이용 가능하게 되어가고 있다는 것이다. 이 모든 것이 사람들에 의해 자발적으로 기부되고 있다. 이러한 사이트 중 하나는 Zebo(http://www.zebo.com)라고 불리는데, 이것은 사람들에게 그들이 소유하고 싶은 것들과 그들이 소유하고 싶은 것들의 목록을 만들도록 장려한다. 광고주나 사회 비평가들의 관점에서, 이것은 그들이 자연스럽게 선호를 표현하는 방법을 결정할 수 있게 해주기 때문에 매우 흥미로운 정보다.


데이터 가져오기 및 준비

이 섹션은 Zebo 웹 사이트에서 데이터 세트를 생성하는 과정을 거치게 된다. 그것은 사이트에서 많은 페이지를 다운로드하고 각 사용자가 원하는 것을 추출하기 위해 구문 분석하는 것을 포함한다. 

  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기