2013-08-22 114 views
0

我有一個由kmeans聚類的數據集。一位朋友告訴我,我可以展示代表每個聚類中心的圖片。他給我的這個簡單的例子代碼:顯示代表kmeans聚類中心(Scikit學習)的圖片

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]) 

我已經試過這一點,但它不工作......爲e.g我有一個小數據集包含20張圖片。 Kmeans爲這20張圖片返回50箇中心。所以我的np.unique(labels)與(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] 

所以如果未來的begans它打破了由i=4,因爲只有20張照片和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))) 

計算k均值

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張圖片的所有描述符...

數據集是pa的一個numpy數組部份以圖片

問候

琳達

+0

如果你只有20個數據點,那麼你犯了兩個錯誤。一種是在20個樣本中嘗試找到50個簇,這是沒有意義的。另一個是你以錯誤的方式將你的數據提供給'KMeans.fit',因爲它似乎認爲你至少有6750分。儘管沒有看到更多的代碼,但不可能知道發生了什麼問題。 –

+0

那麼你做的事情是50多?有人告訴我,我必須採取100到500之間50與貓的圖片...我的設置是更大,但我已經拍了20張圖片來測試這個...編輯:*代碼 – Linda

+0

你不能集羣20點到50與「KMeans」集羣,它會引發異常。 「數據」的形狀是什麼? –

回答

1

如果集羣SIFT描述,集羣方式會像過篩描述,般的畫面。

我相信你在考慮EigenFaces,但這與k-means沒什麼關係。