3.5.3 聚类 : 将观察值分组
以鸢尾花 (iris) 数据集为例,如果有三类鸢尾花,但是并不能访问他们标签,我们可以尝试非观察学习 : 通过一些标准将观察聚类分入一些组。
3.5.3.1 K-means 聚类
最简单的聚类算法是k-means。这个算法将集合分成k个组,将每个观察值分配给一个组,以便使观察值 (在n维空间) 到组平均值的距离最小;然后重新计算平均数。循环进行这个操作直到组收敛,比如达到最大的max_iter
循环次数。
(k-means的另一个实现在SciPy的cluster
包中。scikit-learn
实现的不同在于提供了一个对象API和一些额外的功能,包括智能初始化。)
In [2]:
from sklearn import cluster, datasets
iris = datasets.load_iris()
k_means = cluster.KMeans(n_clusters=3)
k_means.fit(iris.data)
Out[2]:
KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=3, n_init=10,
n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,
verbose=0)
In [25]:
print k_means.labels_[::10]
[0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]
In [26]:
print iris.target[::10]
[0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]
真实情况
K-means (3 组)
K-means (8 组)
在图像压缩中的应用
聚类可以看做从信息中选取一组观察的方式。例如,这个技术可以被用来posterize一个图像 (将连续渐变色调转换为更少色调的一些区域):
In [5]:
from scipy import misc
lena = misc.lena().astype(np.float32)
X = lena.reshape((-1, 1)) # We need an (n_sample, n_feature) array
k_means = cluster.KMeans(n_clusters=5)
k_means.fit(X)
Out[5]:
KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=5, n_init=10,
n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,
verbose=0)
In [6]:
values = k_means.cluster_centers_.squeeze()
labels = k_means.labels_
lena_compressed = np.choose(labels, values)
lena_compressed.shape = lena.shape
源图片
K-means quantization