web-dev-qa-db-ja.com

Python k-meansアルゴリズム

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

46
Eeyore

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

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

54
tom10

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
28
Vebjorn Ljosa

連続データの場合、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)

すべてのデータが通過したときに平均値を印刷するだけで済みますが、リアルタイムで変化を見るのがはるかに楽しいです。 20msの音の周波数エンベロープでこれを使用し、1、2分間話した後、短い「a」母音、長い「o」母音、および「s」子音に一貫したカテゴリがありました。変だ!

20
Nathan

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

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

または、 OpenCVの新しいPythonインターフェイス 、およびそれらの kmeans 実装。

5
Jacob

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

5
denis

SciKit Learnの KMeans() は、Pythonでk-meansクラスタリングを適用する最も簡単な方法です。クラスターのフィッティングは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の資料の提供、上にリンク)

0
gsilv

GDALを使用することもできます。GDALには、空間データを処理するための多くの機能があります。

0
George Silva