Python k-means 알고리즘
-
20-09-2019 - |
문제
코디네이트 데이터베이스를 클러스터하고 캐시하기위한 예제가 포함 된 K-Means 알고리즘의 Python 구현을 찾고 있습니다.
해결책
Scipy의 클러스터링 구현은 잘 작동하며 a K- 평균 구현.
또한 있습니다 Scipy-cluster, 응집 클러스터링을 수행하는; THS는 미리 클러스터 수를 결정할 필요가 없다는 이점이 있습니다.
다른 팁
Scipy 's kmeans2 () 수치 적 문제가 있습니다. 다른 사람들은 가지고 있습니다 보고 된 버전 0.6.0에서 "매트릭스는 긍정적 인 명확성이 아닙니다 - Cholesky Decomposition을 계산할 수 없습니다"와 같은 오류 메시지는 0.7.1 버전에서 동일하게 발생했습니다.
지금은 사용하는 것이 좋습니다 파이 클러스터 대신에. 예제 사용 :
>>> 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
연속 데이터의 경우 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)
모든 데이터가 통과되었을 때 수단을 인쇄 할 수 있지만 실시간으로 변경되는 것을 보는 것이 훨씬 더 재미 있습니다. 나는 이것을 20ms 비트의 사운드의 주파수 봉투에 사용했고, 1 ~ 2 분 동안 그것과 대화를 나눈 후, 짧은 'a'모음, 긴 'o'모음 및 ''s '자음에 대한 일관된 범주가있었습니다. 더 이상!
에서 위키 백과, 당신은 scipy를 사용할 수 있습니다. 벡터 양자화를 클러스터링하는 K- 평균
또는 OpenCV에 파이썬 래퍼를 사용할 수 있습니다. ctypes-opencv.
또는 당신은 할 수 있습니다 OpenCV의 새로운 Python 인터페이스, 그리고 그들의 kmeans 구현.
(몇 년 후)이 kmeans.py 아래 IS-IT-IT-IT-IT-SPECIFY-YOUR-OWN Distance-Function-Using-Scikits-K-Means 간단하고 합리적으로 빠릅니다. scipy.spatial.distance에서 20 개의 메트릭을 사용합니다.
공간 데이터와 함께 작동하기 위해 많은 기능이 많은 GDAL을 사용할 수도 있습니다.
Scikit Learn 's kmeans () 파이썬에서 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 Learn의 문서 제공)
Python의 Pycluster 및 PyPlot은 K-Means 클러스터링 및 2D 데이터의 시각화에 사용할 수 있습니다. 최근 블로그 게시물 Python 및 Pycluster를 사용한 주가/볼륨 분석 재고 데이터에서 pycluster를 사용하여 클러스터링의 예를 제공합니다.