【问题标题】:Define cluster centers manually手动定义聚类中心
【发布时间】:2020-05-29 00:00:18
【问题描述】:

做Kmeans聚类分析,如何手动定义某个聚类中心? 例如,我想说我的聚类中心是 [1,2,3] 和 [3,4,5],现在我想将我的向量聚类到预定义的中心。

类似kmeans.cluster_centers_ = [[1,2,3],[3,4,5]] 的东西?

解决我的问题,这就是我所做的:

number_of_clusters = len(vec)
kmeans = KMeans(number_of_clusters, init='k-means++', n_init=100)
kmeans.fit(vec)

它基本上为每个向量定义了一个簇。但是由于我有数千个向量/句子,因此计算需要很长时间。必须有一个选项可以将矢量坐标直接设置为簇坐标,而无需使用 kmeans 算法计算它们。 (因为中心输出基本上是我运行算法后的矢量坐标......)

编辑以更具体地说明我的任务:

所以我想要的是我有大量的向量(从句子生成),现在我想对这些进行聚类。但是想象一下,我有两列句子,并且总是想将 B 列句子排序为 A 列句子。不是 A 列的句子。这就是为什么我要为 A 列向量设置聚类中心,然后预测与这些中心最近的 B 向量。希望这是有道理的

我正在使用 sklearn kmeans atm

【问题讨论】:

  • 你的问题很模糊。您是自己实现聚类算法吗?或者你正在使用某种图书馆?请发布您的代码的简单示例,以便我们知道发生了什么
  • 通常,在聚类算法中,我们不会在某个点启动一个聚类,而是将它们随机化。我不知道是否有这样做的选择,我从未尝试过。您可以尝试查看您正在使用的库的文档,看看是否有这样的选项
  • 我认为您在这里需要不同的算法。如果您手动定义集群的位置,您并没有准确分析这些集群
  • 所以我想要的是我有大量的向量(从句子生成),现在我想对这些进行聚类。但是想象一下,我有两列句子,并且总是想将 B 列句子排序为 A 列句子。不是 A 列的句子。这就是为什么我要为 A 列向量设置聚类中心,然后预测与这些中心最近的 B 向量。希望这是有道理的
  • 不就是最小距离问题吗?只需将 A 列聚类为 n 个聚类。然后为每个 B 句子找到到 n 个 A 聚类中心的距离。并选择最短距离?不是真正的聚类问题。

标签: python cluster-analysis


【解决方案1】:

我想我知道你想做什么。因此,您希望使用一些已知示例手动选择 k-Means 的质心,然后执行聚类以将最接近的数据点分配给您的预定义质心。

您要查找的参数是名为 init 的 k-Means 初始化,请参阅 documentation

我已经准备了一个小例子,可以做到这一点。

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial import distance_matrix

# 5 datapoints with 3 features
data = [[1, 0, 0],
        [1, 0.2, 0],
        [0, 0, 1],
        [0, 0, 0.9],
        [1, 0, 0.1]]

X = np.array(data)

distance_matrix(X,X)

成对距离矩阵显示哪些示例是最接近的。

> array([[0.        , 0.2       , 1.41421356, 1.3453624 , 0.1       ],
>       [0.2       , 0.        , 1.42828569, 1.36014705, 0.2236068 ],
>       [1.41421356, 1.42828569, 0.        , 0.1       , 1.3453624 ],
>       [1.3453624 , 1.36014705, 0.1       , 0.        , 1.28062485],
>       [0.1       , 0.2236068 , 1.3453624 , 1.28062485, 0.        ]])

您可以选择某些数据点作为初始质心

centroid_idx = [0,2] # let data point 0 and 2 be our centroids
centroids = X[centroid_idx,:]
print(centroids) # [[1. 0. 0.]
                 # [0. 0. 1.]]

kmeans = KMeans(n_clusters=2, init=centroids, max_iter=1) # just run one k-Means iteration so that the centroids are not updated

kmeans.fit(X)
kmeans.labels_

>>> array([0, 0, 1, 1, 0], dtype=int32)

如您所见,k-Means 按预期标记数据点。如果您希望更新质心,则可能需要省略 max_iter 参数。

【讨论】:

  • 这正是我想要实现的!非常感谢您抽出时间来回答。
  • 您是否知道,为什么“kmeans.fit(X) kmeans.labels_”命令会导致:“C:\Users\ga2943\AppData\Local\Continuum\anaconda3\lib\site -packages\sklearn\cluster\k_means_.py:972: RuntimeWarning: 显式初始中心位置已通过:在 k-means 中只执行一个 init 而不是 n_init=10 return_n_iter=True)"
  • 我看到了你的问题,你现在遇到的警告已经在这里得到了回答stackoverflow.com/questions/28862334/…
猜你喜欢
  • 2016-08-27
  • 2020-05-13
  • 2018-12-20
  • 2018-02-02
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多