如何用Python设置k-Means聚类标签从高到低?

2024-04-29 14:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个38套公寓的数据集,包括早上、下午和晚上的用电量。我试图使用scikit learn中的k-Means实现对这个数据集进行分组,并得到一些有趣的结果。

第一个聚类结果: Img

这一切都很好,有了4个集群,我显然得到了4个与每个公寓相关的标签-0,1,2和3。使用KMeans方法的random_state参数,我可以修复质心随机初始化的种子,因此一致地获得属于同一单元的相同标签。

然而,由于这种具体情况是关于能源消耗的,因此可以在最高和最低消费者之间进行可测量的分类。因此,我希望将标签0分配给消费水平最低的公寓,将标签1分配给消费水平稍高的公寓,依此类推。

截至目前,我的标签是[2 1 3 0]或[“黑色”、“绿色”、“蓝色”、“红色”];我希望它们是[0 1 2 3]或[“红色”、“绿色”、“黑色”、“蓝色”]。我应该如何继续这样做,同时仍然保持质心初始化随机(固定种子)?

非常感谢你的帮助!


Tags: 数据聚类标签scikit种子learnmeans蓝色
1条回答
网友
1楼 · 发布于 2024-04-29 14:29:12

通过查找表转换标签是实现所需功能的一种简单方法。

首先,我生成一些模拟数据:

import numpy as np

np.random.seed(1000)

n = 38
X_morning = np.random.uniform(low=.02, high=.18, size=38)
X_afternoon = np.random.uniform(low=.05, high=.20, size=38)
X_night = np.random.uniform(low=.025, high=.175, size=38)
X = np.vstack([X_morning, X_afternoon, X_night]).T

然后我对数据执行集群:

from sklearn.cluster import KMeans
k = 4
kmeans = KMeans(n_clusters=k, random_state=0).fit(X)

最后,我使用NumPy的^{}来创建这样的查找表:

idx = np.argsort(kmeans.cluster_centers_.sum(axis=1))
lut = np.zeros_like(idx)
lut[idx] = np.arange(k)

样本运行:

In [70]: kmeans.cluster_centers_.sum(axis=1)
Out[70]: array([ 0.3214523 ,  0.40877735,  0.26911353,  0.25234873])

In [71]: idx
Out[71]: array([3, 2, 0, 1], dtype=int64)

In [72]: lut
Out[72]: array([2, 3, 1, 0], dtype=int64)

In [73]: kmeans.labels_
Out[73]: array([1, 3, 1, ..., 0, 1, 0])

In [74]: lut[kmeans.labels_]
Out[74]: array([3, 0, 3, ..., 2, 3, 2], dtype=int64)

idx显示从最低消耗级别到最高消耗级别排序的群集中心标签。lut[kmeans.labels_]0/3的装置属于最低/最高消耗水平的簇。

相关问题 更多 >