Scipy-cluster

提供:Dev Guides
移動先:案内検索

SciPy-クラスター

  • K-meansクラスタリング*は、ラベルのないデータのセットでクラスターとクラスターセンターを見つける方法です。 直観的には、クラスターは、クラスターの外側のポイントまでの距離と比較してポイント間の距離が短いデータポイントのグループで構成されていると考えることができます。 Kセンターの初期セットを考えると、K平均アルゴリズムは、次の2つのステップを繰り返します-
  • 各センターについて、トレーニングポイントのサブセット(そのクラスター)は、他のどのセンターよりも近くにあります。
  • 各クラスターのデータポイントの各特徴の平均が計算され、この平均ベクトルがそのクラスターの新しい中心になります。

これらの2つのステップは、センターが移動しなくなるか、割り当てが変更されなくなるまで繰り返されます。 次に、最も近いプロトタイプのクラスターに新しいポイント x を割り当てることができます。 SciPyライブラリは、クラスターパッケージを通じてK-Meansアルゴリズムの適切な実装を提供します。 使い方を理解しましょう。

SciPyでのK-Meansの実装

SciPyでK-Meansを実装する方法を理解します。

K平均のインポート

インポートされた各関数の実装と使用方法を確認します。

from SciPy.cluster.vq import kmeans,vq,whiten

データ生成

クラスタリングを調査するには、いくつかのデータをシミュレートする必要があります。

from numpy import vstack,array
from numpy.random import rand

# data generation with three features
data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))

次に、データを確認する必要があります。 上記のプログラムは、次の出力を生成します。

array([[e+00, 8.17445796e-01, 1.00834051e+00],
       [ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01],
       [ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01],
       …………….

特徴ごとに観測グループを正規化します。 K-Meansを実行する前に、観測セットの各特徴次元をホワイトニングで再スケーリングすることが有益です。 各特徴は、すべての観測値の標準偏差で除算され、単位分散が与えられます。

データを白くする

データを白色化するには、次のコードを使用する必要があります。

# whitening of data
data = whiten(data)

3つのクラスターでK平均を計算する

次のコードを使用して、3つのクラスターでK-Meansを計算します。

# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)

上記のコードは、K個のクラスターを形成する観測ベクトルのセットに対してK平均を実行します。 K-Meansアルゴリズムは、十分な進捗が得られなくなるまで、つまり重心を調整します。 最後の反復がしきい値よりも小さいため、歪みの変化。 ここでは、以下のコードを使用してセントロイド変数を出力することにより、クラスターのセントロイドを観察できます。

print(centroids)

上記のコードは以下の出力を生成します。

print(centroids)[ [ 2.26034702  1.43924335  1.3697022 ]
                  [ 2.63788572  2.81446462  2.85163854]
                  [ 0.73507256  1.30801855  1.44477558] ]

以下のコードを使用して、各値をクラスターに割り当てます。

# assign each sample to a cluster
clx,_ = vq(data,centroids)
*vq* 関数は、「M」×「N」の *obs* 配列内の各観測ベクトルを重心と比較し、観測を最も近いクラスターに割り当てます。 各観測値のクラスターと歪みを返します。 歪みも確認できます。 次のコードを使用して、各観測のクラスターを確認します。
# check clusters of observation
print clx

上記のコードは以下の出力を生成します。

array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1,
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1,  0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0,
2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)

上記の配列の異なる値0、1、2はクラスターを示します。