SciPy - 聚类
K 均值聚类是一种在一组未标记数据中查找聚类和聚类中心的方法。直观地讲,我们可以将聚类视为 - 由一组数据点组成,这些数据点之间的距离与聚类外部点之间的距离相比较小。给定一组初始的 K 个中心,K 均值算法将迭代以下两个步骤 −
对于每个中心,将识别出距离它最近的训练点子集(其聚类)。
计算每个聚类中数据点的每个特征的平均值,该均值向量将成为该聚类的新中心。
迭代这两个步骤,直到中心不再移动或分配不再改变。然后,可以将新点 x 分配给最近原型的聚类。SciPy 库通过 cluster 包提供了 K-Means 算法的良好实现。让我们了解如何使用它。
SciPy 中的 K-Means 实现
我们将了解如何在 SciPy 中实现 K-Means。
导入 K-Means
我们将看到每个导入函数的实现和用法。
from SciPy.cluster.vq import kmeans,vq,whiten
数据生成
我们必须模拟一些数据来探索聚类。
from numpy import vstack,array from numpy.random import rand # 具有三个特征的数据生成 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 之前,最好使用白化重新调整观测集的每个特征维度。每个特征除以其在所有观测值中的标准差,以赋予其单位方差。
对数据进行白化
我们必须使用以下代码对数据进行白化。
# 数据白化 data = whiten(data)
使用三个聚类计算 K-Means
现在让我们使用以下代码使用三个聚类计算 K-Means。
# 使用 K = 3(2 个聚类)计算 K-Means 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] ]
使用下面给出的代码将每个值分配给一个集群。
# 将每个样本分配给一个集群 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、2 表示聚类。