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

标签 python sorting numpy scikit-learn k-means

我有一个包含 38 间公寓及其早上、下午和晚上的用电量的数据集。我正在尝试使用 scikit-learn 中的 k-Means 实现对该数据集进行聚类,并得到了一些有趣的结果。

第一个聚类结果: Img

一切都很好,对于 4 个集群,我显然得到了与每个公寓关联的 4 个标签 - 0、1、2 和 3。使用 KMeansrandom_state 参数> 方法,我可以修复其中随机初始化质心的种子,因此我始终如一地获得归因于相同公寓的相同标签。

但是,由于此特定案例涉及能源消耗,因此可以在最高和最低消费者之间执行可衡量的分类。因此,我想将标签 0 分配给消费水平最低的公寓,将标签 1 分配给消费多一点的公寓,依此类推。

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

非常感谢您的帮助!

最佳答案

通过查找表 转换标签是实现您想要的目标的直接方法。

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

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 的 argsort创建一个这样的查找表:

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 的公寓属于消费水平最低/最高的集群。

关于python - 如何使用 Python 从最高到最低设置 k-Means 聚类标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44888415/

相关文章:

arrays - Python numpy : Importing data with only one column from a csv into 2D array

python - 如何动态更改 __slots__ 属性?

python - 检查 Python DNS 解析器查询的特定输出

python - 筛选比较,计算相似度得分,python

python - 捕获 json 响应

algorithm - 高效重复分拣

javascript - 使用 jquery 不使用插件对表的列进行排序

python - 具有相同批量维度的两个矩阵行之间的点积

c++ - 如何按降序打印数组?

python - 多项式系数的最大递归