K-means 聚类和向量量化 (scipy.cluster.vq)#

提供k-means聚类的例程,从k-means模型生成代码本,并通过将向量与代码本中的质心进行比较来量化向量。

whiten(obs[, check_finite])

在每个特征的基础上对一组观测值进行归一化。

vq(obs, code_book[, check_finite])

将代码本中的代码分配给观察结果。

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

对一组观测向量执行 k-means 聚类,形成 k 个簇。

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

使用k-means算法将一组观测值分类为k个簇。

背景信息#

k-means 算法以要生成的聚类数 k 和一组观测向量作为输入。它返回一组质心,每个 k 聚类一个。观测向量被分类为与其最近的质心的聚类编号或质心索引。

如果向量 v 比其他任何质心更接近质心 i,则向量 v 属于簇 i。如果 v 属于 i,我们称质心 i 是 v 的主导质心。k-means 算法试图最小化失真,失真定义为每个观测向量与其主导质心之间的平方距离之和。通过迭代地将观测值重新分类到簇中并重新计算质心,直到质心稳定为止,从而实现最小化。也可以定义最大迭代次数。

由于向量量化是k-means的自然应用,因此经常使用信息论术语。质心索引或聚类索引也被称为“代码”,而将代码映射到质心及其逆的表格通常被称为“代码簿”。k-means的结果,即一组质心,可以用于量化向量。量化的目标在于找到一种减少预期失真的向量编码。

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

作为一个例子,假设我们希望在通过网络发送之前压缩一个24位彩色图像(每个像素由一个字节表示红色,一个字节表示蓝色,一个字节表示绿色)。通过使用较小的8位编码,我们可以将数据量减少三分之二。理想情况下,应选择每个256种可能的8位编码值的颜色以最小化颜色的失真。运行k=256的k-means算法生成一个包含256个代码的代码簿,这些代码填充了所有可能的8位序列。不是为每个像素发送一个3字节的值,而是传输占主导地位的质心的8位质心索引(或代码字)。代码簿也会通过网络发送,以便每个8位代码可以被转换回24位像素值表示。如果感兴趣的图像是大海,我们预计许多24位的蓝色将被8位代码表示。如果是一张人脸图像,更多的肤色将在代码簿中表示。