按升序生成 Kmeans 的质心

Posted

技术标签:

【中文标题】按升序生成 Kmeans 的质心【英文标题】:Generate Centriods of Kmeans in Ascending Order 【发布时间】:2020-06-13 22:12:47 【问题描述】:

我正在尝试使用 Sklearn 库在 Python 中使用 Kmean 算法。我的问题是,有什么方法可以按升序生成质心。 例如这是我的代码:

kmeanDataFrame = pd.DataFrame('x':X,'y':Y)
kmean = KMeans(init='k-means++',n_clusters = 6,random_state=0, n_init=10)
kmean.fit(kmeanDataFrame)
print(kmean.labels_)
print(kmean.cluster_centers_)

这里X和Y是数组,我给出的是不同年份的国家人口排名数据。例如,当我给它 2011 年时,中心点会不断变化,它会生成如下所示的中心点:

[[ 4.22019639  2.88409457]
[ 1.15267995  0.7954897 ]
[ 2.49913831  1.64727509]
[-1.71104298 -1.54454861]
[ 6.99545873  6.08921786]
[ 0.20412018  0.0517948 ]]

当我在 2012 年通过时,它会生成如下:

[[ 0.94596298  0.64243913]
[ 4.2710023   3.0083124 ]
[-0.27485671 -0.35197801]
[ 2.41465001  1.59198646]
[-6.514922   -4.53656495]
[ 7.77638888  7.18733868]]

有什么方法可以像这样按升序生成质心(先是负点,然后是正点):

[[-1.71104298 -1.54454861],
[ 0.20412018  0.0517948 ],
[ 1.15267995  0.7954897 ],
[ 2.49913831  1.64727509],
[ 4.22019639  2.88409457],
[ 6.99545873  6.08921786]]

【问题讨论】:

为了讨论:这篇文章一般来说可能有帮助,但它不适用于 python ***.com/questions/17685327/… 【参考方案1】:

假设你碰巧有以下聚类:

from sklearn.cluster import KMeans
np.random.seed(42)
X = np.random.rand(10000)
Y = np.random.rand(10000)
kmeanDataFrame = pd.DataFrame('x':X,'y':Y)
kmean = KMeans(init='k-means++',n_clusters = 6,random_state=0, n_init=10)
kmean.fit(kmeanDataFrame)

cc = kmean.cluster_centers_
print(cc)

[[0.14575507 0.27937172]
 [0.76783063 0.80079467]
 [0.47849743 0.14838875]
 [0.2147012  0.79923057]
 [0.48920425 0.5285314 ]
 [0.83935504 0.27354554]]

然后您可以沿第 0 列排序:

idx = np.argsort(cc[:,0])
cc[idx,:]
array([[0.14575507, 0.27937172],
       [0.2147012 , 0.79923057],
       [0.47849743, 0.14838875],
       [0.48920425, 0.5285314 ],
       [0.76783063, 0.80079467],
       [0.83935504, 0.27354554]])

或第一列:

idx = np.argsort(cc[:,1])
cc[idx,:]
array([[0.47849743, 0.14838875],
       [0.83935504, 0.27354554],
       [0.14575507, 0.27937172],
       [0.48920425, 0.5285314 ],
       [0.2147012 , 0.79923057],
       [0.76783063, 0.80079467]])

【讨论】:

基本上目的不是事后排序,我正在检查不同年份的国家人口数据,并试图分析哪些国家多年来改变了他们的集群位置。所以这就是为什么我想使用 KMean 将质心从负值变为正值。 我明白了。从表面上看,您可以使用init 参数来试试运气,您可以在其中传递预定义的质心以进行集群搜索初始化。给你一个更有意义的答案,除了纯粹的美学,你这样做的目的是什么? KMeans 本质上是随机的。尝试将您的质心按所需顺序传递给init,看看结果是否让您满意。【参考方案2】:

生成均值后,可以使用python中的sorted函数对均值列表进行排序。如下面的代码行

sorted_Centers=已排序 (kmean.cluster_centers_)

【讨论】:

基本上目的不是事后排序,我正在检查不同年份的国家人口数据,并试图分析哪些国家多年来改变了他们的集群位置。所以这就是为什么我想使用 KMean 将质心从负值变为正值。

以上是关于按升序生成 Kmeans 的质心的主要内容,如果未能解决你的问题,请参考以下文章

kmeans集群中节点和质心之间的距离?

如何使用 tSNE 和 kmeans 质心找到质心对应的原始数据点?

使用 KMeans 时为每个质心获取超过 2 个坐标

Sklearn.KMeans() :获取类质心标签并引用数据集

kmeans 分类到预定的质心

如何使用 skleans 的 KMeans 查看 n_init 每次迭代的集群质心