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 和一组要聚类的观察向量作为输入。它返回一组质心,每个聚类一个质心。观察向量被分类为最接近它的质心的聚类编号或质心索引。

如果向量 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 位代码表示。如果是人脸图像,则代码簿中将表示更多的肉色调。