0

kmeans によってクラスター化されたデータセットがあります。友人は、各クラスターセンターを表す写真を見せてもいいと言った。彼は私にこの短いサンプルコードをくれました:

for i in xrange(len(np.unique(labels))):
     this_cluster = np.where(labels == i)[0]
     fig, ax = plt.subplots(len(this_cluster))
     for im in this_cluster:
        ax.imshow(images[im])

私はこれを試しましたが、うまくいきません...たとえば、20枚の写真を含む小さなデータセットがあります。Kmeans は、この 20 個の写真に対して 50 個の中心を返します。したがって、私の np.unique(labels) with (labels = kmeans.labels_?!) は50に等しい...したがって、「i」は0から49まで実行されます...私の最初の「this_cluster」は次のようになります:

[   4    8   18   19   35   37   50  135  140  146  156  214  371  506  563
  586  594  887  916  989  993 1021 1061 1105 1121 1128 1405 1409 1458 1466
 1481 1484 1505 1572 1573 1620 1784 1817 1835 1854 1945 1955 2004 2006 2054
 2135 2204 2245 2319 2321 2343 2391 2410 2414 2486 2502 2530 2594 2624 2629
 2825 2828 2833 2911 3017 3097 3245 3246 3298 3347 3493 3568 3627 3677 3701
 3789 3866 3941 3944 3969 4022 4115 4214 4215 4432 4527 4559 4594 4645 4668
 4699 4785 4797 4802 4807 4831 4892 4905 4921 4929 4932 5076 5178 5233 5249
 5318 5463 5508 5571 5621 5644 5661 5678 5690 5727 5736 5737 5755 5777 5961
 6088 6089 6107 6197 6353 6487 6500 6515 6565 6575 6601 6706 6749]

したがって、次の for が始まると、i=420枚の写真しかなく、範囲外になるため、images[im]それが壊れim>20ます...「this_clusters」は、データセットから取得された記述子であり、kmeans によって計算され、クラスター 0 に設定されていると思います。 ..だから、これは正しくありませんか?! または私は間違った方法にいます。誰かが私を助けてくれるかもしれません。

編集*:

create sets

X_train_pos, X_test_pos, X_dataset_train_pos, X_dataset_test_pos  = train_test_split(X_desc_pos, dataset_pos, test_size=0.5) 
  X_train_neg, X_test_neg, X_dataset_train_neg, X_dataset_test_neg = train_test_split(X_desc_neg,  dataset_neg, test_size=0.5) 
  # merge list of array descriptor into descriptor list
  x1 = numpy.vstack(X_train_pos)
  x2 = numpy.vstack(X_train_neg)

  # compute cluster centers 
  kmeans, n_clusters = dataset_module.create_center_data(numpy.vstack((x1,x2)),numpy.vstack((X_dataset_train_pos,X_dataset_train_neg)))

kmeans を計算する

def create_center_data(data,dataset): 
    n_clusters = len(data)
    n_clusters = math.sqrt(n_clusters/2)
    n_clusters = int(n_clusters)
    kmeans = KMeans(init='k-means++', n_clusters=n_clusters, n_init=1)
    kmeans.fit(data)
    numpy.set_printoptions(threshold=numpy.nan)
    labels = kmeans.labels_
    for i in xrange(len(numpy.unique(labels))):
        this_cluster = numpy.where(labels == i)[0]
        fig, ax = plt.subplots(len(this_cluster))
        for im in this_cluster:
            pic = open(dataset[im], "rb")
            ax.imshow(pic)
    return kmeans, n_clusters

データは次のようになります。

[[ 36.   1.   9. ...,   0.   0.   0.]
 [  0.   0.   1. ...,   0.   0.   0.]
 [  0.   0.   0. ...,   0.   0.   1.]
 ..., 
 [ 49.  26.   0. ...,  12.   4.   5.]
 [  0.   0.   0. ...,   0.   0.   0.]
 [  0.   3.   8. ...,   0.   0.   3.]]

データ = 20 個の画像のすべての記述子...

データセットは、写真へのパスを持つnumpy配列です

よろしく

リンダ

4

1 に答える 1

1

SIFT記述子をクラスター化すると、クラスター平均は画像ではなく、ふるい記述子のように見えます。

あなたは EigenFaces について考えていたと思いますが、それは k-means とはほとんど関係がありません。

于 2013-08-22T16:02:07.083 に答える