K-均值聚类和矢量量化 (scipy.cluster.vq
)#
提供了用于 K-均值聚类、从 K-均值模型生成码本以及通过将矢量与码本中的质心进行比较来量化矢量的例程。
|
按特征对一组观测值进行归一化。 |
|
将码本中的代码分配给观测值。 |
|
对一组观测矢量执行 K-均值聚类,形成 K 个簇。 |
|
使用 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 位代码表示。如果图像是人脸,码本中会表示更多的肤色。