scipy.cluster.vq.

kmeans#

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

对一组观测向量执行 K-均值,形成 K 个聚类。

K-均值算法调整观测值到聚类的分类,并更新聚类中心,直到中心在连续迭代中的位置稳定。在这个算法的实现中,中心的稳定性是通过比较观测值与其对应中心之间的平均欧氏距离的变化的绝对值与阈值来确定的。这将生成一个代码簿,将中心映射到代码,反之亦然。

参数::
obsndarray

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

k_or_guessint 或 ndarray

要生成的中心数量。每个中心都分配一个代码,它也是生成的代码簿矩阵中中心的的行的索引。

最初的 K 个中心是通过从观测矩阵中随机选择观测值来选择的。或者,传递一个 K 行 N 列的数组来指定最初的 K 个中心。

iterint,可选

运行 K-均值的次数,返回具有最低失真的代码簿。如果为 k_or_guess 参数指定了数组,则忽略此参数。此参数不代表 K-均值算法的迭代次数。

threshfloat,可选

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

check_finitebool,可选

是否检查输入矩阵是否只包含有限的数字。禁用可能会带来性能提升,但在输入中包含无穷大或 NaN 时可能会导致问题(崩溃,不终止)。默认值:True

seed{None, int, numpy.random.Generator, numpy.random.RandomState}, 可选

用于初始化伪随机数生成器的种子。如果 seed 为 None(或 numpy.random),则使用 numpy.random.RandomState 单例。如果 seed 是一个整数,则使用一个新的 RandomState 实例,并使用 seed 对其进行播种。如果 seed 已经是 GeneratorRandomState 实例,则使用该实例。默认值为 None。

返回值::
codebookndarray

一个 K 行 N 列的数组,包含 K 个中心。第 i 个中心 codebook[i] 用代码 i 表示。生成的中心和代码代表看到的最低失真,不一定是全局最小失真。请注意,中心数量不一定是 k_or_guess 参数的值,因为在迭代期间,分配给没有观测值的中心会被移除。

distortionfloat

传递的观测值与生成的中心之间的平均(非平方)欧氏距离。请注意,与 K-均值算法中失真的标准定义不同,标准定义是平方距离的总和。

另请参见

kmeans2

K-均值聚类的另一种实现,具有更多用于生成初始中心的方法,但没有使用失真变化阈值作为停止条件。

whiten

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

注释

有关更多功能或最佳性能,您可以使用 sklearn.cluster.KMeans 是几种实现的基准结果。

示例

>>> 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