2017-04-03 13 views
0

私は2つの属性を持つポイントデータセットを持っており、属性値に基づいてこれらのポイントをクラスタリングしたいと思います。私はKを使用したいのはクラスタリングを意味しますが、Scipyの実装を使用するときの入力データの表示方法は不明です。Kのデータ入力は、Scipy、Pythonによるクラスタリングを意味しますか?

たとえば、FID、属性1、属性2、x-coord、y-coord、または属性値のみの配列を含む各行を持つnumpy配列を作成する必要がありますか?属性は整数と浮動小数点数です。

+0

:あなたのデータは、二つのフィールドattr1attr2はしていると仮定して、あなたは彼らのように見えるwhould対応するコードを含むリストdatasetがありますか?私。あなたはクラスタリングのために考慮したい点の位置ですか?または属性値のみ? – hildensia

+0

は主に属性値ですが、ポイントデータは既に集計されており、サンプリング目的で位置に関係なくクラスタ化したいからです。 – Tins

答えて

0

データ内の各行は、個別の観測値であり、列はデータのフィーチャまたはディメンションに対応する必要があります。あなたの場合:FID、属性1、属性2、x-coord、y-coordは列にあり、各行は異なる時間ステップでの観測値を表す必要があります。

from scipy.cluster.vq import kmeans,vq 
nbStates = 4 
Centers, _ = kmeans(Data, nbStates) 
Data_id, _ = vq(Data, Centers) 

ここで5列はあなたの5つの機能FID、属性1、属性2、X-COORD、Y-COORD、及びN観察に対応するN個の行に対応する場所データNX5行列であるべきです。言い換えると、FIDデータ配列を列ベクトルとして再構成し、他のフィーチャでも同様に水平連結し、kmeans関数の引数として配置します。 nbStatesは、見たいクラスタの数を表します。事前に設定する必要があります。結果として得られるのは、Nがクラスタに対応し、Mがデータ内のフィーチャの数に対応するN×M行列であるセンタです。 Data_id行列は、各クラスタに対応するデータポイントのラベルを表す列ベクトルです。これは、Nがデータ点の数であるN×1行列である。

0

アトリビュートのみにクラスタ化する場合は、scipy docsに従って、2xNのマトリックスを作成し、アトリビュートをカラムに、各データポイントをローとして作成する必要があります。

おそらく、データポイントをホワイトニング(正規化)することによって結果を向上させるでしょう。 xとyの位置は、クラスタに関連している

from scipy.cluster.vq import kmeans, whiten 

data = np.ndarray((2, len(dataset)) 
for row, d in enumerate(dataset): 
    data[0, row] = d.attr1 
    data[1, row] = d.attr2 

whitened_data = np.whiten(data) 

clusters, _ = scipy.cluster.vq.kmeans(data, 5) # 5 is the number of clusters you assume 
assignments, _ = vq(data, clusters) 
関連する問題