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

  1. from sklearn import cluster, datasets
  2. iris = datasets.load_iris()
  3. k_means = cluster.KMeans(n_clusters=3)
  4. k_means.fit(iris.data)

Out[2]:

  1. KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=3, n_init=10,
  2. n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,
  3. verbose=0)

In [25]:

  1. print k_means.labels_[::10]
  1. [0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]

In [26]:

  1. print iris.target[::10]
  1. [0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]

真实情况

3.5.3 聚类 : 将观察值分组 - 图1K-means (3 组)

3.5.3 聚类 : 将观察值分组 - 图2K-means (8 组)

3.5.3 聚类 : 将观察值分组 - 图3

在图像压缩中的应用

聚类可以看做从信息中选取一组观察的方式。例如,这个技术可以被用来posterize一个图像 (将连续渐变色调转换为更少色调的一些区域):

In [5]:

  1. from scipy import misc
  2. lena = misc.lena().astype(np.float32)
  3. X = lena.reshape((-1, 1)) # We need an (n_sample, n_feature) array
  4. k_means = cluster.KMeans(n_clusters=5)
  5. k_means.fit(X)

Out[5]:

  1. KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=5, n_init=10,
  2. n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,
  3. verbose=0)

In [6]:

  1. values = k_means.cluster_centers_.squeeze()
  2. labels = k_means.labels_
  3. lena_compressed = np.choose(labels, values)
  4. lena_compressed.shape = lena.shape

源图片

3.5.3 聚类 : 将观察值分组 - 图4

K-means quantization

3.5.3 聚类 : 将观察值分组 - 图5