集群(Cluster)
优质
小牛编辑
130浏览
2023-12-01
K-means clustering是一种在一组未标记数据中查找聚类和聚类中心的方法。 直觉上,我们可能会认为一个聚类是由一组数据点组成的,它们的点间距离与到聚类外部点的距离相比较小。 给定一组初始的K中心,K-means算法迭代以下两个步骤 -
对于每个中心,识别比其更靠近它的训练点子集(其簇)比任何其他中心。
计算每个聚类中数据点的每个特征的平均值,并且该平均向量成为该聚类的新中心。
迭代这两个步骤直到中心不再移动或分配不再改变。 然后,可以将新点x分配给最近原型的簇。 SciPy库通过集群包提供了良好的K-Means算法实现。 让我们了解如何使用它。
K-Means在SciPy中的实现
我们将了解如何在SciPy中实现K-Means。
Import K-Means
我们将看到每个导入函数的实现和使用。
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算法调整质心,直到不能进行足够的进展,即失真的变化,因为最后一次迭代小于某个阈值。 在这里,我们可以通过使用下面给出的代码打印质心变量来观察聚类的质心。
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'中的每个观察向量与' 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表示簇。