我有一个由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 = 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]
所以,如果下一个因为只有20张图片和i=4
而images[im]
因为只有20张图片会打破,我会认为“this_clusters”是从数据集中获取的描述符,由kmeans计算并设置为簇0 ...所以这不可能是正确的?!或者我错了路。也许有人可以帮助我。
编辑*:
im>20
计算kmeans
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)))
数据如下:
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
data = 20张图片的所有描述符......
数据集是一个带有图片路径的numpy数组
问候
琳达
答案 0 :(得分:1)
如果您群集 SIFT描述符,您的群集意味着看起来像筛选描述符,不是就像图像一样。
我相信你在考虑EigenFaces,但这与k-means没什么关系。