K 均值聚类和矢量量化 (scipy.cluster.vq)#

提供用于 K 均值聚类、从 K 均值模型生成码本以及通过将向量与码本中的质心进行比较来量化向量的例程。

whiten(obs[, check_finite])

按特征对观察值组进行规范化。

vq(obs, code_book[, check_finite])

从码本中分配代码到观察值。

kmeans(obs, k_or_guess[, iter, thresh, ...])

对一组观察向量执行 K 均值,形成 k 个聚类。

kmeans2(data, k[, iter, thresh, minit, ...])

使用 K 均值算法将一组观察值分类为 k 个聚类。

背景信息#

K 均值算法将要生成的聚类数量 k 和要聚类的观察向量集作为输入。它返回一组质心,每个 k 个聚类对应一个质心。观察向量根据与它最接近的质心的聚类编号或质心索引进行分类。

向量 v 属于聚类 i,如果它比其他任何质心更接近质心 i。如果 v 属于 i,我们说质心 i 是 v 的主导质心。K 均值算法试图最小化失真,失真定义为每个观察向量与其主导质心之间距离的平方和。通过迭代地将观察值重新分类到聚类中并重新计算质心,直到达到质心稳定的配置,从而实现最小化。还可以定义最大迭代次数。

由于矢量量化是 K 均值的自然应用,因此信息论术语经常被使用。质心索引或聚类索引也称为“代码”,将代码映射到质心以及反之的表通常称为“码本”。K 均值的结果(一组质心)可以用于量化向量。量化旨在找到减少预期失真的向量编码。

所有例程都期望 obs 是一个 M 行 N 列的数组,其中行是观察向量。码本是一个 k 行 N 列的数组,其中第 i 行是代码字 i 的质心。观察向量和质心具有相同的特征维数。

例如,假设我们希望压缩一个 24 位彩色图像(每个像素由一个红色字节、一个蓝色字节和一个绿色字节表示),然后通过网络发送它。通过使用更小的 8 位编码,我们可以将数据量减少三分之二。理想情况下,应该选择 256 个可能的 8 位编码值的每个值的颜色,以最大程度地减少颜色的失真。使用 k=256 运行 K 均值会生成一个包含 256 个代码的码本,它填充所有可能的 8 位序列。与其为每个像素发送一个 3 字节值,不如发送主导质心的 8 位质心索引(或代码字)。码本也被发送到网络,因此每个 8 位代码可以被翻译回 24 位像素值表示。如果目标图像是海洋,我们预计许多 24 位蓝色将被 8 位代码表示。如果它是一个人的脸的图像,更多的肤色将被表示在码本中。