共计 1594 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
CIFAR-10 是一个广泛使用的图像分类数据集,包含 10 个类别的 60000 张 32×32 彩色图片。对于聚类任务来说,这个数据集有几个特点:
- 图像尺寸小,计算量相对可控
- 类别之间有明显的视觉差异
- 数据量适中,适合教学和实验
但直接对原始像素进行聚类会遇到以下挑战:
- 高维度问题(32x32x3=3072 维)
- 像素值对光照变化敏感
- 同类物体可能有不同姿态和位置
技术方案
数据预处理
- 图像标准化
将像素值从 0 -255 缩放到 0 - 1 范围,这对基于距离的算法(如 K -means)很重要:
X = cifar10.data.astype('float32') / 255.0
- PCA 降维
使用 PCA 将 3072 维数据降到更适合聚类的维度(如 50-100 维):
from sklearn.decomposition import PCA
pca = PCA(n_components=100)
X_pca = pca.fit_transform(X.reshape(50000, -1))
特征提取
有两种主要方法:
- 原始像素:简单直接,但包含冗余信息
- CNN 特征:更高级的语义特征,但需要预训练模型
这里我们展示原始像素 +PCA 的方法,适合新手入门:
聚类算法
使用 K -means 算法,注意几个关键参数:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=10,
init='k-means++',
n_init=10,
max_iter=300)
clusters = kmeans.fit_predict(X_pca)
完整代码示例
import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# 加载数据
cifar10 = fetch_openml('CIFAR_10', version=1)
X = cifar10.data.astype('float32') / 255.0
y = cifar10.target
# PCA 降维
pca = PCA(n_components=100)
X_pca = pca.fit_transform(X.reshape(50000, -1))
# K-means 聚类
kmeans = KMeans(n_clusters=10, random_state=42)
clusters = kmeans.fit_predict(X_pca)
# 评估
score = silhouette_score(X_pca, clusters)
print(f'Silhouette Score: {score:.3f}')
效果评估
-
轮廓系数:衡量聚类紧密度和分离度,值在 - 1 到 1 之间,越大越好
-
可视化:用 t -SNE 将高维数据降到 2D 观察聚类结果

图:t-SNE 降维后的聚类可视化,不同颜色代表不同簇
实战建议
- 大数据优化 :对 50000+ 数据,使用 MiniBatchKMeans
- 特征选择 :CNN 特征通常优于原始像素,可以尝试:
from tensorflow.keras.applications import VGG16 model = VGG16(weights='imagenet', include_top=False) - 常见问题 :
- 如果轮廓系数低,尝试调整 PCA 维度
- 如果收敛慢,减小 max_iter 或增大 tol
延伸思考
- 如何确定最佳聚类数量?除了轮廓系数还能用什么方法?
- 如果某些类别总是被分到同一个簇,可能是什么原因?
- 对于彩色图像,将 RGB 转为灰度再做聚类会有什么影响?
希望这篇指南能帮助你入门图像聚类。记住,实践是最好的老师,多尝试不同的参数和方法,观察它们如何影响结果。
正文完
