scipy.cluster.vq.

kmeans#

scipy.cluster.vq.kmeans(obs, k_or_guess, iter=20, thresh=1e-05, check_finite=True, *, rng=None)[source]#

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

k-means 算法调整观测值到簇的分类,并更新簇的质心,直到质心的位置在连续迭代中稳定。 在此算法的实现中,质心的稳定性通过比较观测值与其对应质心之间的平均欧几里得距离变化的绝对值与阈值来确定。 这产生了一个代码本,将质心映射到代码,反之亦然。

参数:
obsndarray

M x N 数组的每一行都是一个观测向量。 列是每次观测期间看到的特征。 特征必须首先使用 whiten 函数进行白化。

k_or_guessint 或 ndarray

要生成的质心的数量。 代码被分配给每个质心,该代码也是生成的 code_book 矩阵中质心的行索引。

初始 k 个质心通过从观测矩阵中随机选择观测值来选择。 或者,传递 k x N 数组指定初始 k 个质心。

iterint, 可选

运行 k-means 的次数,返回失真最低的代码本。 如果使用 k_or_guess 参数的数组指定初始质心,则忽略此参数。 此参数不表示 k-means 算法的迭代次数。

threshfloat, 可选

如果自上次 k-means 迭代以来的失真变化小于或等于阈值,则终止 k-means 算法。

check_finitebool, 可选

是否检查输入矩阵是否仅包含有限数字。 禁用可能会提高性能,但如果输入确实包含无穷大或 NaN,则可能会导致问题(崩溃、无法终止)。 默认值:True

rng{None, int, numpy.random.Generator}, 可选

如果通过关键字传递 rng,则 numpy.random.Generator 以外的类型将传递给 numpy.random.default_rng 以实例化 Generator。 如果 rng 已经是 Generator 实例,则使用提供的实例。 指定 rng 以实现可重复的函数行为。

如果此参数按位置传递,或者 seed 通过关键字传递,则参数 seed 应用旧版行为

  • 如果 seed 为 None(或 numpy.random),则使用 numpy.random.RandomState 单例。

  • 如果 seed 是一个整数,则使用一个新的 RandomState 实例,并用 seed 初始化。

  • 如果 seed 已经是 GeneratorRandomState 实例,则使用该实例。

1.15.0 版本中的更改: 作为从使用 numpy.random.RandomState 过渡到 numpy.random.GeneratorSPEC-0007 的一部分,此关键字已从 seed 更改为 rng。 在过渡期间,两个关键字将继续工作,但一次只能指定一个关键字。 在过渡期之后,使用 seed 关键字的函数调用将发出警告。 上面概述了 seedrng 的行为,但在新代码中应仅使用 rng 关键字。

返回值:
codebookndarray

一个 k x N 的 k 个质心数组。 第 i 个质心 codebook[i] 用代码 i 表示。 生成的质心和代码表示看到的最低失真,不一定是全局最小失真。 请注意,质心的数量不一定与 k_or_guess 参数相同,因为在迭代期间会删除分配给没有观测值的质心。

distortionfloat

传递的观测值与生成的质心之间的平均(非平方)欧几里得距离。 请注意与 k-means 算法上下文中失真的标准定义的区别,后者是平方距离的总和。

另请参阅

kmeans2

k-means 聚类的不同实现,具有更多生成初始质心的方法,但未使用失真变化阈值作为停止标准。

whiten

必须在将观测矩阵传递给 kmeans 之前调用。

注释

为了获得更多功能或最佳性能,您可以使用 sklearn.cluster.KMeansThis 是几个实现的基准测试结果。

kmeans 除了 NumPy 之外,还对 Python Array API Standard 兼容后端提供实验性支持。 请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。 支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

Dask

⚠️ 计算图

不适用

有关更多信息,请参阅 支持数组 API 标准

示例

>>> import numpy as np
>>> from scipy.cluster.vq import vq, kmeans, whiten
>>> import matplotlib.pyplot as plt
>>> features  = np.array([[ 1.9,2.3],
...                       [ 1.5,2.5],
...                       [ 0.8,0.6],
...                       [ 0.4,1.8],
...                       [ 0.1,0.1],
...                       [ 0.2,1.8],
...                       [ 2.0,0.5],
...                       [ 0.3,1.5],
...                       [ 1.0,1.0]])
>>> whitened = whiten(features)
>>> book = np.array((whitened[0],whitened[2]))
>>> kmeans(whitened,book)
(array([[ 2.3110306 ,  2.86287398],    # random
       [ 0.93218041,  1.24398691]]), 0.85684700941625547)
>>> codes = 3
>>> kmeans(whitened,codes)
(array([[ 2.3110306 ,  2.86287398],    # random
       [ 1.32544402,  0.65607529],
       [ 0.40782893,  2.02786907]]), 0.5196582527686241)
>>> # Create 50 datapoints in two clusters a and b
>>> pts = 50
>>> rng = np.random.default_rng()
>>> a = rng.multivariate_normal([0, 0], [[4, 1], [1, 4]], size=pts)
>>> b = rng.multivariate_normal([30, 10],
...                             [[10, 2], [2, 1]],
...                             size=pts)
>>> features = np.concatenate((a, b))
>>> # Whiten data
>>> whitened = whiten(features)
>>> # Find 2 clusters in the data
>>> codebook, distortion = kmeans(whitened, 2)
>>> # Plot whitened data and cluster centers in red
>>> plt.scatter(whitened[:, 0], whitened[:, 1])
>>> plt.scatter(codebook[:, 0], codebook[:, 1], c='r')
>>> plt.show()
../../_images/scipy-cluster-vq-kmeans-1.png