scipy.cluster.vq.kmeans

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

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

k-Means算法将观测的分类调整为群集,并更新群集质心,直到质心的位置在连续迭代中保持稳定。在该算法的实现中,通过将观测与其对应的质心之间的平均欧几里德距离的变化的绝对值与阈值进行比较来确定质心的稳定性。这产生了将质心映射到代码的代码簿,反之亦然。

参数
obsndarray

M×N阵列的每一行都是观测向量。这些列是在每次观察过程中看到的特征。要素必须首先使用 whiten 功能。

k_or_guess整数或ndarray

要生成的质心数。为每个质心分配一个代码,该代码也是生成的码本矩阵中质心的行索引。

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

iter整型,可选

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

thresh浮动,可选

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

check_finite布尔值,可选

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

seed :{无,整型, numpy.random.Generator{无,整型,

用于初始化伪随机数生成器的种子。如果 seed 为无(或 numpy.random )、 numpy.random.RandomState 使用的是Singleton。如果 seed 是一个整型、一个新的 RandomState 实例,其种子设定为 seed 。如果 seed 已经是一个 GeneratorRandomState 实例,则使用该实例。默认值为None。

退货
codebookndarray

由k个质心组成的k×N阵列。第i个质心码本 [i] 所生成的质心和代码表示可见的最低失真,而不一定是全局最小失真。请注意,质心的数量不一定与 k_or_guess 参数,因为在迭代过程中不会删除指定给任何观测的质心。

distortion浮动

通过的观测值与生成的质心之间的平均(非平方)欧几里德距离。注意在k-Means算法的上下文中失真的标准定义的不同,k-Means算法是距离的平方和。

参见

kmeans2

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

whiten

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

注意事项

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

示例

>>> from numpy import array
>>> from scipy.cluster.vq import vq, kmeans, whiten
>>> import matplotlib.pyplot as plt
>>> features  = 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