web-dev-qa-db-ja.com

python(機械学習?))での近接度による値のクラスタリング

一連のオブジェクトで実行されているアルゴリズムがあります。このアルゴリズムは、セット内の要素間の差異を指示するスコア値を生成します。

ソートされた出力は次のようになります。

[1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230]

これらの値をスプレッドシートに配置すると、グループを構成していることがわかります。

[1,1,5,6,1,5] [10,22,23,23] [50,51,51,52] [100,112,130] [500,512,600] [12000,12230]

これらのグループをプログラムで取得する方法はありますか?

おそらく、機械学習ライブラリを使用したクラスタリングアルゴリズムですか?それとも私はこれを考えすぎていますか?

私はscikitを見てきましたが、それらの例は私の問題にはあまりにも進んでいます...

12
PCoelho

1次元データにクラスタリングを使用しないでください

クラスタリングアルゴリズムは、多変量データ用に設計されています。 1次元データがある場合は、sortそれを探し、最大のギャップを探します。これは些細なことであり、1dではfastであり、2dでは不可能です。より高度なものが必要な場合は、カーネル密度推定(KDE)を使用し、極小値を探してデータセットを分割します。

この質問には多くの重複があります。

19
Anony-Mousse

クラスターの数がわからない場合の適切なオプションはMeanShiftです。

import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth

x = [1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230]

X = np.array(Zip(x,np.zeros(len(x))), dtype=np.int)
bandwidth = estimate_bandwidth(X, quantile=0.1)
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_

labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)

for k in range(n_clusters_):
    my_members = labels == k
    print "cluster {0}: {1}".format(k, X[my_members, 0])

このアルゴリズムの出力:

cluster 0: [ 1  1  5  6  1  5 10 22 23 23 50 51 51 52]
cluster 1: [100 112 130]
cluster 2: [500 512]
cluster 3: [12000]
cluster 4: [12230]
cluster 5: [600]

quantilevariableを変更すると、クラスタリング番号の選択基準を変更できます

19
jabaldonedo

クラスタリングを使用して、これらをグループ化できます。秘訣は、データには2つの次元があることを理解することです。つまり、表示できる次元と、[1、2、3 ... 22]のような「空間」次元です。この行列は次のように numpy で作成できます。

import numpy as np

y = [1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230]
x = range(len(y))
m = np.matrix([x, y]).transpose()

次に、次の方法でマトリックスに対してクラスタリングを実行できます。

from scipy.cluster.vq import kmeans
kclust = kmeans(m, 5)

kclustの出力は次のようになります。

(array([[   11,    51],
       [   15,   114],
       [   20, 12115],
       [    4,     9],
       [   18,   537]]), 21.545126372346271)

あなたにとって最も興味深い部分は、行列の最初の列です。これは、そのx次元に沿った中心が何であるかを示しています。

kclust[0][:, 0]
# [20 18 15  4 11]

次に、5つのセンターのどれに最も近いかに基づいて、ポイントをクラスターに割り当てることができます。

assigned_clusters = [abs(cluster_indices - e).argmin() for e in x]
# [3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 2, 2, 2, 2, 1, 1, 0, 0, 0]
3
David Robinson