如何手动设置K均值集群的中心?



我不想预测中心,而是将每个对象分配给一个已经定义的中心。我该怎么办?

您可以将KMean fit到所需的集群中心,然后使用此模型来预测数据。

from sklearn.cluster import KMeans
import numpy as np
cluster_centers = np.array([[1, 1], [0, 0]])
data  = [[1, 2], [1, 1], [3, 1], [10, -1]]
kmeans = KMeans(n_clusters=2, init=cluster_centers, n_init=1)
kmeans.fit(cluster_centers)

我们只是用我们想要的两个中心点来拟合模型,使我们想要的聚类中心成为模型的实际中心。

kmeans.cluster_centers_
# array([[0., 0.],
#        [1., 1.]])
kmeans.predict(data)
# array([1, 1, 1, 1])

如果我们使用这个模型来分配数据,那么所有数据点都被分配给集群1。

相反,如果我们在集群中心启动,然后将模型与数据相匹配,这些中心就会被调整,不再是我们最初想要的中心。

kmeans_init = KMeans(n_clusters=2, init=cluster_centers, n_init=1)
kmeans_init.fit(data)
kmeans_init.cluster_centers_
# array([[ 1.66666667,  1.33333333],
#        [10.        , -1.        ]])
kmeans_init.predict(data)
# array([0, 0, 0, 1])

现在数据分布在两个集群上。

注意:n_clusters必须匹配集群中心的数量

您可能还想看看Scipy中的KMeans实现。参数minit接受矩阵和

将k参数解释为初始质心的k乘M(或一维数据的长度k阵列)阵列。

您必须定义一个包含所需中心的数组(我们称之为X),并在kmean算法中输入"init=X"看看sklearn的以下例子:

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='auto')
>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
...               [10, 2], [10, 4], [10, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([1, 1, 1, 0, 0, 0], dtype=int32)
>>> kmeans.predict([[0, 0], [12, 3]])
array([1, 0], dtype=int32)
>>> kmeans.cluster_centers_
array([[10.,  2.],
       [ 1.,  2.]])

有关详细信息:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

一种方法是使用sklearn.cluster.KMeans模块的n_initrandom_state参数,如下所示:

from sklearn.cluster import KMeans
c = KMeans(n_init=1, random_state=1)

这做了两件事:1) random_state=1将质心种子设置为1。这与具体选择所需质心的坐标并不完全相同,但它确实允许您控制和复制种子。

2) n_init=1将迭代次数设置为1,这意味着您将把集群尝试限制为仅在random_state步骤中自己选择的种子。

此外,还可以使用n_clusters参数选择要创建的质心数量。

从这里开始,拟合和预测将把点分配给您预先建立的不同聚类。

Sklearn在进行预测之前会进行is_fitted()检查。因此,您可以使用伪数据拟合模型。然后,您可以使用KMeans实例的cluster_centers_参数强制集群质心,如下所示:

kmeans.cluster_centers_ = np.array([[218,173,63],
                                    [146,122,50],
                                    [69,77,36]]).astype(np.float64)

相关内容

  • 没有找到相关文章

最新更新