質問

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

役に立ちましたか?

解決

Scipyのクラスタリング 実装はうまく機能し、以下が含まれます。 K 平均法 実装。

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

他のヒント

その他:

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)

あなただけのすべてのデータが通過した際の手段を印刷しますが、リアルタイムに変化し、それを見て、そのはるかに楽しいことができます。私は音の20msのビットの周波数封筒にこれを使用し、2分のためにそれに話をした後、それは短い「」母音、母音「O」長い、および「S」の子音のための一貫性のあるカテゴリを持っていました。奇妙な!

から ウィキペディア, 、scipyを使用できます、 ベクトル量子化の K-means クラスタリング

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

あるいは、できます OpenCVの新しいPythonインターフェース, 、そして彼らの kmeans 実装。

(数年後)この kmeans.py の下にあります scikits-learn-k-means を使用して独自の距離関数を指定することは可能ですか 簡単でかなり高速です。scipy.spatial. distance 内の 20 個以上のメトリクスのいずれかを使用します。

また、空間データを操作するために多くの多くの機能を持ってGDALを使用することができます。

SciKit学習の関数kmeans()のですPythonで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学習者の好意上記のリンクドキュメント、)

PythonのPyclusterとpyplotはk平均クラスタリングおよび2Dデータの視覚化のために使用することができます。 PythonとPyClusterを使用した最近のブログ記事株価/ボリュームの分析の在庫データにPyClusterを使用して、クラスタリングの例を示します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top