48

座標のデータベースをクラスター化してキャッシュする例を含む、k-means アルゴリズムの Python 実装を探しています。

4

8 に答える 8

56

更新:(この最初の回答から11年後、おそらく更新の時期です。)

まず最初に、本当に k-means が必要ですか? このページは、いくつかの異なるクラスタリング アルゴリズムの優れたグラフィック サマリーを提供します。グラフィックを超えて、特に各メソッドが必要とするパラメーターを見て、必要なパラメーターを提供できるかどうかを判断することをお勧めします (たとえば、k-means にはクラスターの数が必要ですが、開始する前にわからない場合があります)。クラスタリング)。

以下にいくつかのリソースを示します。

古い答え:

Scipy のクラスタリングの実装はうまく機能し、k-means の実装が含まれています。

凝集クラスタリングを行うscipy-clusterもあります。これには、事前にクラスターの数を決定する必要がないという利点があります。

于 2009-10-09T22:10:57.093 に答える
29

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
于 2010-02-08T20:03:43.783 に答える
21

連続データの場合、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」子音の一貫したカテゴリがありました。変だ!

于 2010-04-09T05:21:50.143 に答える
6

(数年後) is-it-possible-to-specify-your-own-distance-function-using-scikits-learn-k- means の下にあるこの kmeans.pyは、簡単でかなり高速です。scipy.spatial.distance の 20 個の奇数のメトリックのいずれかを使用します。

于 2011-07-04T14:43:41.447 に答える
5

wikipediaから、ベクトル量子化をクラスタリングするscipy、K-means を使用できます

または、OpenCV の Python ラッパーであるctypes-opencvを使用できます。

または、 OpenCV の新しい Python インターフェイスとそのkmeans実装を使用することもできます。

于 2009-10-09T19:21:30.063 に答える
0

Python の Pycluster と pyplot は、k-means クラスタリングと 2D データの視覚化に使用できます。最近のブログ投稿、 Python と PyCluster を使用した株価/出来高分析では、株式データで PyCluster を使用したクラスタリングの例を示しています。

于 2014-09-14T20:47:16.640 に答える
0

空間データを操作するための多くの関数を備えた GDAL を使用することもできます。

于 2009-10-09T19:35:19.320 に答える