SciPy - 集群

  • 简述

    K-means clustering是一种在一组未标记数据中寻找聚类和聚类中心的方法。直观地说,我们可以将集群视为 - 由一组数据点组成,与集群外点的距离相比,它们的点间距离很小。给定一组初始的 K 个中心,K-means 算法迭代以下两个步骤 -
    • 对于每个中心,比任何其他中心都更接近它的训练点子集(其集群)被识别出来。
    • 计算每个集群中数据点的每个特征的平均值,这个平均向量成为该集群的新中心。
    重复这两个步骤,直到中心不再移动或分配不再改变。然后,一个新的点x可以分配到最近原型的集群。SciPy 库通过 cluster 包提供了 K-Means 算法的良好实现。让我们了解如何使用它。
  • SciPy 中的 K-Means 实现

    我们将了解如何在 SciPy 中实现 K-Means。

    导入 K 均值

    我们将看到每个导入函数的实现和使用。
    
    from SciPy.cluster.vq import kmeans,vq,whiten
    

    数据生成

    我们必须模拟一些数据来探索聚类。
    
    from numpy import vstack,array
    from numpy.random import rand
    # data generation with three features
    data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))
    
    现在,我们必须检查数据。上述程序将生成以下输出。
    
    array([[ 1.48598868e+00, 8.17445796e-01, 1.00834051e+00],
           [ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01],
           [ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01],
           …………….
    
    基于每个特征对一组观察值进行归一化。在运行 K-Means 之前,使用白化重新缩放观察集的每个特征维度是有益的。每个特征除以其所有观测值的标准差,得到单位方差。

    白化数据

    我们必须使用下面的代码来白化数据。
    
    # whitening of data
    data = whiten(data)
    
  • 使用三个集群计算 K-Means

    现在让我们使用以下代码计算具有三个集群的 K-Means。
    
    # computing K-Means with K = 3 (2 clusters)
    centroids,_ = kmeans(data,3)
    
    上面的代码对形成 K 个簇的一组观察向量执行 K-Means。K-Means 算法调整质心,直到无法取得足够的进展,即失真的变化,因为最后一次迭代小于某个阈值。在这里,我们可以通过使用下面给出的代码打印 centroids 变量来观察集群的质心。
    
    print(centroids)
    
    上面的代码将生成以下输出。
    
    print(centroids)[ [ 2.26034702  1.43924335  1.3697022 ]
                      [ 2.63788572  2.81446462  2.85163854]
                      [ 0.73507256  1.30801855  1.44477558] ]
    
    使用下面给出的代码将每个值分配给一个集群。
    
    # assign each sample to a cluster
    clx,_ = vq(data,centroids)
    
    vq函数将“M”中的每个观察向量与“N”进行比较obs具有质心的数组并将观察分配给最近的集群。它返回每个观察的聚类和失真。我们也可以检查失真。让我们使用以下代码检查每个观察的集群。
    
    # check clusters of observation
    print clx
    
    上面的代码将生成以下输出。
    
    array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1,
    0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0,
    0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 1,  0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0,
    2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
    2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
    
    上述数组的不同值 0、1、2 表示集群。