SciPy 聚类
K-means聚类 是一种在一组未标记的数据中寻找聚类和聚类中心的方法。直观地讲,我们可以认为一个聚类是由一组数据点组成的,这些数据点之间的距离与聚类之外的点的距离相比很小。给定一个初始的K中心集,K-means算法迭代以下两个步骤
- 对于每个中心,确定比其他中心更接近它的训练点子集(它的簇)。
-
计算每个聚类中数据点的每个特征的平均值,这个平均值向量成为该聚类的新中心。
这两个步骤反复进行,直到中心不再移动或分配不再改变。然后,一个新的点 x 可以被分配到最接近原型的聚类中。SciPy库通过集群包提供了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 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] ]
通过使用下面的代码将每个值分配给一个群组。
# 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表示群组。