2009-10-09 3 views
44

나는 파이썬 구현을 k- 평균 알고리즘을 클러스터와 캐시에 예제를 사용하여 찾고있다.파이썬 k- 평균 알고리즘

+1

나는 이미지에 대한 유사한 구현했다. RGB 값 대신 2 차원 배열을 사용할 수 있습니다. 매우 순진하지만 https://github.com/keremgocen/pattern-recog-notes에 적합합니다. – mass

답변

53

Scipy's clustering 구현이 잘 작동하며 구현시 k-means을 포함합니다.

응집성 클러스터링을 수행하는 scipy-cluster도 있습니다. 클러스터의 수를 미리 결정할 필요가 없다는 장점이 있습니다.

0

GDAL을 사용할 수도 있습니다. GDAL은 공간 데이터로 작업 할 수있는 많은 기능을 가지고 있습니다.

28

SciPy의 kmeans2()에는 몇 가지 수치적인 문제가 있습니다. 다른 사람은 reported이라는 오류 메시지가 있습니다. "매트릭스는 양수입니다. 콜렉스 분해는 계산할 수 없습니다."버전 0.6.0에서, 그리고 나는 버전 0.7.1에서 방금 만났습니다.

지금은 PyCluster을 사용하는 것이 좋습니다. 사용 예 :

>>> import numpy 
>>> import Pycluster 
>>> points = numpy.vstack([numpy.random.multivariate_normal(mean, 
                  0.03 * numpy.diag([1,1]), 
                  20) 
          for mean in [(1, 1), (2, 4), (3, 2)]]) 
>>> labels, error, nfound = Pycluster.kcluster(points, 3) 
>>> labels # Cluster number for each point 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32) 
>>> error # The within-cluster sum of distances for the solution 
1.7721661785401261 
>>> nfound # Number of times this solution was found 
1 
+2

또한 scipy cluster kmeans 함수는 거리 메서드를 허용하지 않으며 항상 유클리드를 사용합니다. PyCluster를 사용하는 또 다른 이유는 무엇입니까? – Sid

+0

그냥 오류를 언급 언급했다 ... 나는 당신의 예제에서 클러스터 그룹을 볼 수 있지만 클러스터 "센터"를 얻을 수 있습니까? – monkut

+0

@monkup, numpy.vstack ([points [labels == i] .mean (0) in range (labels.max() +1)])'클러스터의 중심을 가져옵니다. –

19

연속 데이터의 경우 k- 평균은 매우 쉽습니다.

평균의 목록이 필요하며 각 데이터 포인트에 대해 새 데이터 포인트에 가장 가까운 평균값을 찾고 평균값을 찾습니다. 당신의 수단은 입력 데이터에서 가장 최근의 포인트 클러스터를 나타낼 것입니다.

나는 평균을 연속적으로 수행하므로 새 평균을 얻기 위해 이전 데이터를 가질 필요가 없습니다. 이전 평균 k 다음 데이터 포인트 x, 그리고 평균을 유지하기 위해 과거의 데이터 포인트의 수를하는 일정 n을 감안할 때, 새로운 평균은 여기

k*(1-(1/n)) + n*(1/n) 

파이썬

의 전체 코드입니다
from __future__ import division 
from random import random 

# init means and data to random values 
# use real data in your code 
means = [random() for i in range(10)] 
data = [random() for i in range(1000)] 

param = 0.01 # bigger numbers make the means change faster 
# must be between 0 and 1 

for x in data: 
    closest_k = 0; 
    smallest_error = 9999; # this should really be positive infinity 
    for k in enumerate(means): 
     error = abs(x-k[1]) 
     if error < smallest_error: 
      smallest_error = error 
      closest_k = k[0] 
     means[closest_k] = means[closest_k]*(1-param) + x*(param) 

모든 데이터가 통과되면 수단을 인쇄 할 수 있지만 실시간으로 변경하는 것이 훨씬 재미 있습니다. 나는 이것을 20 밀리 비트의 주파수의 엔벨로프 (envelope)에 사용했고, 1 ~ 2 분 정도 이야기를 한 후에는 짧은 'a'모음, long o 모음, 's'자음에 대해 일관된 범주를 유지했습니다. ~!

+0

이것은 훌륭한 온라인 학습 kmeans 알고리즘입니다! 그러나 코드 마지막 행에 버그가 있습니다. 이 행에있는 하나의 탭을 제거해야합니다. 즉 [nearest_k] = [nearest_k] * (1-param) + x * (param) – lai

-1

파이썬의 Pycluster와 pyplot은 k-means 클러스터링과 2D 데이터의 시각화에 사용될 수 있습니다. 최근 블로그 게시물 Stock Price/Volume Analysis Using Python and PyCluster은 주식 데이터에 PyCluster를 사용한 클러스터링의 예를 제공합니다.

-3

* Pyhon이 코드 K-수단이 *

from math import math 

from functions import functions 

class KMEANS: 

@staticmethod 
def KMeans(data,classterCount,globalCounter): 
counter=0 
classes=[] 
cluster =[[]] 
cluster_index=[] 
tempClasses=[] 
for i in range(0,classterCount): 
globalCounter+=1 
classes.append(cluster) 
cluster_index.append(cluster) 
tempClasses.append(cluster) 
classes2=classes[:] 
for i in range(0,len(classes)): 
globalCounter=1 
cluster = [data[i]] 
classes[i]=cluster 
functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) 
functions.ResetClasterIndex(classes2,classterCount,globalCounter) 
def clusterFills(classeses,globalCounter,counter): 
counter+=1 
combinedOfClasses = functions.CopyTo(classeses) 
functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) 
functions.ResetClasterIndex(tempClasses,classterCount,globalCounter) 
avarage=[] 
for k in range(0,len(combinedOfClasses)): 
globalCounter+=1 
avarage.append(functions.GetAvarage(combinedOfClasses[k])) 
for i in range(0,len(data)): 
globalCounter+=1 
minimum=0 
index=0 
for k in range(0,len(avarage)): 
total=0.0 
for j in range(0,len(avarage[k])): 
total += (avarage[k][j]-data[i][j]) **2 
tempp=math.sqrt(total) 
if(k==0): 
minimu=tempp 
if(tempp&lt;=minimu): 
minimu=tempp 
index=k 
tempClasses[index].append(data[i]) 
cluster_index[index].append(i) 
if(functions.CompareArray(tempClasses,combinedOfClasses)==1): 
return clusterFills(tempClasses,globalCounter,counter) 
returnArray = [] 
returnArray.append(tempClasses) 
returnArray.append(cluster_index) 
returnArray.append(avarage) 
returnArray.append(counter) 
return returnArray 

cdcd = clusterFills(classes,globalCounter,counter) 
if cdcd !=None: 
return cdcd 

@staticmethod 
def KMeansPer(data,classterCount,globalCounter): 
perData=data[0:int(float(len(data))/100*30)] 
result = KMEANS.KMeans(perData,classterCount,globalCounter) 
cluster_index=[] 
tempClasses=[] 
classes=[] 
cluster =[[]] 
for i in range(0,classterCount): 
globalCounter+=1 
classes.append(cluster) 
cluster_index.append(cluster) 
tempClasses.append(cluster) 
classes2=classes[:] 
for i in range(0,len(classes)): 
globalCounter=1 
cluster = [data[i]] 
classes[i]=cluster 
functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) 
functions.ResetClasterIndex(classes2,classterCount,globalCounter) 
counter=0 
def clusterFills(classeses,globalCounter,counter): 
counter+=1 
combinedOfClasses = functions.CopyTo(classeses) 
functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) 
functions.ResetClasterIndex(tempClasses,classterCount,globalCounter) 
avarage=[] 
for k in range(0,len(combinedOfClasses)): 
globalCounter+=1 
avarage.append(functions.GetAvarage(combinedOfClasses[k])) 
for i in range(0,len(data)): 
globalCounter+=1 
minimum=0 
index=0 
for k in range(0,len(avarage)): 
total=0.0 
for j in range(0,len(avarage[k])): 
total += (avarage[k][j]-data[i][j]) **2 
tempp=math.sqrt(total) 
if(k==0): 
minimu=tempp 
if(tempp&lt;=minimu): 
minimu=tempp 
index=k 
tempClasses[index].append(data[i]) 
cluster_index[index].append(i) 
if(functions.CompareArray(tempClasses,combinedOfClasses)==1): 
return clusterFills(tempClasses,globalCounter,counter) 
returnArray = [] 
returnArray.append(tempClasses) 
returnArray.append(cluster_index) 
returnArray.append(avarage) 
returnArray.append(counter) 
return returnArray 

cdcd = clusterFills(result[0],globalCounter,counter) 
if cdcd !=None: 
return cdcd 

Read ...

0

KMeans() 알아 SciKit 파이썬에서 클러스터링을 k는-의미 적용하는 가장 간단한 방법입니다. 피팅 클러스터는 다음과 같이 간단합니다. kmeans = KMeans(n_clusters=2, random_state=0).fit(X).

이 코드 스 니펫은 중심 좌표를 저장하고 좌표 배열에 대해 클러스터를 예측하는 방법을 보여줍니다.

>>> from sklearn.cluster import KMeans 
>>> import numpy as np 
>>> X = np.array([[1, 2], [1, 4], [1, 0], 
...    [4, 2], [4, 4], [4, 0]]) 
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X) 
>>> kmeans.labels_ 
array([0, 0, 0, 1, 1, 1], dtype=int32) 
>>> kmeans.predict([[0, 0], [4, 4]]) 
array([0, 1], dtype=int32) 
>>> kmeans.cluster_centers_ 
array([[ 1., 2.], 
     [ 4., 2.]]) 

(위에 링크 SciKit의 호의 알아 설명서)

관련 문제