📜  SciPy-群集

📅  最后修改于: 2020-11-05 04:30:12             🧑  作者: Mango


K均值聚类是一种用于在一组未标记数据中查找聚类和聚类中心的方法。从直觉上讲,我们可以将群集视为–由一组数据点组成,这些数据点的点间距离与到群集外点的距离相比较小。给定初始的K个中心集,K-means算法将迭代以下两个步骤-

  • 对于每个中心,与其他任何中心相比,都标识了更靠近它的训练点子集(其簇)。

  • 计算每个聚类中数据点的每个特征的均值,并且该均值向量成为该聚类的新中心。

重复执行这两个步骤,直到中心不再移动或分配不再更改。然后,可以将新的点x分配给最接近的原型的群集。 SciPy库通过群集程序包很好地实现了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均值

现在让我们使用以下代码计算具有三个聚类的K-Means。

# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)

上面的代码对形成K个聚类的一组观察向量执行K-Means。由于最后一次迭代小于某个阈值,因此K-Means算法会调整质心,直到无法取得足够的进展(即失真变化)为止。在这里,我们可以使用下面给出的代码打印质心变量来观察集群的质心。

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表示群集。