K-均值聚类与矢量量化 (scipy.cluster.vq )

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

whiten \(OBS[, check_finite] )

在每个要素的基础上对一组观测进行标准化。

vq \(OBS,代码_BOOK[, check_finite] )

将代码簿中的代码指定给观测值。

kmeans \(OBS,k_或_猜测[, iter, thresh, ...] )

对形成k个簇的一组观测向量执行k均值。

kmeans2 \(数据,k[, iter, thresh, minit, ...] )

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

背景资料

k-Means算法将要生成的簇数k和要聚类的一组观测向量作为输入。它返回一组质心,k个群集中的每一个都有一个质心。利用与其最接近的质心的簇号或质心索引对观察向量进行分类。

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

由于矢量量化是k-均值的自然应用,因此经常使用信息论术语。质心索引或群集索引也被称为“代码”,并且将代码映射到质心的表常被称为“代码簿”,反之亦然。k-均值(一组质心)的结果可用于量化向量。量化的目的是找到一种减少预期失真的矢量编码。

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

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