SciPy - 集群

K-means聚类是一种在一组未标记数据中查找聚类和聚类中心的方法.直觉上,我们可能会认为群集是由一组数据点组成的,这些数据点的点间距离与到群集外部点的距离相比较小.给定一组初始的K中心,K-means算法迭代以下两个步骤 :

  • 对于每个中心,识别出比其他任何中心更接近的训练点子集(其集群).

  • 每个特征中每个特征的平均值计算集群,这个均值向量成为该集群的新中心.

这两个步骤被迭代,直到中心不再移动或者作业不再改变.然后,可以将新点 x 分配给最近原型的簇. SciPy库通过集群包提供了良好的K-Means算法实现.让我们了解如何使用它.

K-Means在SciPy中的实现

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

导入K-Means

我们将看到每个导入函数的实现和用法.

 
来自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-Means一组观察向量形成K簇. K-Means算法调整质心,直到不能进行足够的进展,即失真的变化,因为最后一次迭代小于某个阈值.在这里,我们可以通过使用下面给出的代码打印质心变量来观察聚类的质心.

 
 print(centroids)

以上代码将生成以下输出.

print(centroids)[ [ 2.26034702  1.43924335  1.3697022 ]
                  [ 2.63788572  2.81446462  2.85163854]
                  [ 0.73507256  1.30801855  1.44477558] ]

使用以下方法为群集分配每个值下面给出的代码.

 
#将每个样本分配给一个簇
 clx,_ = vq(data,centroids)

vq 函数将'M'中的每个观察向量与'N' obs 数组中的质心进行比较将观察分配给最近的群集.它返回每个观察的簇和失真.我们也可以检查失真.让我们使用以下代码检查每个观察的聚类.

 
#检查观察集群
 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, ab的2 ove数组表示簇.