2013-08-22 2 views
0

kmeans에 의해 클러스터 된 데이터 세트가 있습니다. 친구는 각 클러스터 센터를 대표하는 그림을 보여줄 수 있다고했습니다. 그는 나에게이 짧은 예제 코드입니다 주었다 :이 시도했습니다kmeans 클러스터 센터를 나타내는 그림 표시 (Scikit learn)

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 개의 센터를 반환합니다. 그래서 (레이블 = kmeans.labels_ ?!) 내 np.unique (레이블)은 50과 같습니다 ... "i"는 0에서 49까지 ... 내 첫번째 "this_cluster"는 다음과 같습니다 :

의 다음 나에게 경계의 밖으로을 줄 것이다 20 사진과 im>20images[im]가 있기 때문에 i=4에 의해 파괴 begans 경우
[ 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] 

그래서 ... 난 "this_clusters은"계산되는 데이터 집합에서 촬영 한 기술자 생각 kmeans에 의해 클러스터 0으로 설정 ... 그래서 이것이 맞을 수 없다! 또는 나는 틀린 길에있다. 어쩌면 누군가 나를 도울 수 있습니다.

EDIT *

[[ 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의 모든 픽쳐 디스크립터 ...

세트 :

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 

데이터 등을 보인다 pa를 가진 질적 인 배열이다. 사진을 부르게

관련

린다

+0

데이터 포인트가 20 개인 경우 실수가 두 번 있습니다. 하나는 20 개의 샘플에서 50 개의 클러스터를 찾으려고하는 것이고, 이는 의미가 없습니다. 다른 하나는 당신이 적어도 6750 포인트를 가지고 있다고 생각하기 때문에 데이터를 잘못된 방법으로'KMeans.fit'에 공급한다는 것입니다. 더 많은 코드를 보지 않으면 무엇이 잘못 될지 말할 수 없습니다. –

+0

50 개 정도되는 것이 좋습니까? 누군가는 내가 고양이와 함께 50 장의 사진을 찍기 위해 100에서 500 사이를 가져야한다고 말한다. 내 세트는 훨씬 더 크지 만 이것을 시험하기 위해 20 장의 사진을 찍는다 ... 편집 : * 코드 – Linda

+0

50 점으로 20 점을 클러스터링 할 수 없다. KMeans로 클러스터를 구성하면 예외가 발생합니다. '데이터'의 모양은 무엇입니까? –

답변

1

당신이 SIFT 기술자 클러스터 경우 이미지처럼, 하지를 설명자를 선별처럼, 클러스터 수단은 볼 것이다.

나는 당신이 EigenFaces를 생각하고 있다고 생각하지만, 그것은 k- 수단과 관련이 거의 없습니다.