座標のデータベースをクラスター化してキャッシュする例を含む、k-means アルゴリズムの Python 実装を探しています。
8 に答える
更新:(この最初の回答から11年後、おそらく更新の時期です。)
まず最初に、本当に k-means が必要ですか? このページは、いくつかの異なるクラスタリング アルゴリズムの優れたグラフィック サマリーを提供します。グラフィックを超えて、特に各メソッドが必要とするパラメーターを見て、必要なパラメーターを提供できるかどうかを判断することをお勧めします (たとえば、k-means にはクラスターの数が必要ですが、開始する前にわからない場合があります)。クラスタリング)。
以下にいくつかのリソースを示します。
古い答え:
Scipy のクラスタリングの実装はうまく機能し、k-means の実装が含まれています。
凝集クラスタリングを行うscipy-clusterもあります。これには、事前にクラスターの数を決定する必要がないという利点があります。
SciPy のkmeans2()にはいくつかの数値的な問題があります。バージョン 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
連続データの場合、k-means は非常に簡単です。
平均のリストが必要です。各データ ポイントについて、それに最も近い平均を見つけ、それに新しいデータ ポイントを平均します。あなたの手段は、入力データ内の最近の顕著なポイントのクラスターを表します。
平均化を継続的に行うため、新しい平均を取得するために古いデータを取得する必要はありません。古い平均k
、次のデータ ポイントx
、および平均を保持する過去のデータ ポイントの数である定数n
を指定すると、新しい平均は次のようになります。
k*(1-(1/n)) + n*(1/n)
ここにPythonの完全なコードがあります
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 ミリ秒の音の周波数エンベロープで使用し、1、2 分話してみたところ、短い「a」母音、長い「o」母音、および「s」子音の一貫したカテゴリがありました。変だ!
(数年後) is-it-possible-to-specify-your-own-distance-function-using-scikits-learn-k- means の下にあるこの kmeans.pyは、簡単でかなり高速です。scipy.spatial.distance の 20 個の奇数のメトリックのいずれかを使用します。
wikipediaから、ベクトル量子化をクラスタリングするscipy、K-means を使用できます
または、OpenCV の Python ラッパーであるctypes-opencvを使用できます。
または、 OpenCV の新しい Python インターフェイスとそのkmeans実装を使用することもできます。
Python の Pycluster と pyplot は、k-means クラスタリングと 2D データの視覚化に使用できます。最近のブログ投稿、 Python と PyCluster を使用した株価/出来高分析では、株式データで PyCluster を使用したクラスタリングの例を示しています。
空間データを操作するための多くの関数を備えた GDAL を使用することもできます。