Ser*_*gio 9 python sorting numpy k-means scikit-learn
我在早上,下午和晚上都有38套公寓和电力消耗的数据集.我正在尝试使用scikit-learn的k-Means实现来聚类这个数据集,并且我得到了一些有趣的结果.
第一个聚类结果:

这一切都很好,有4个簇我显然得到4个标签与每个公寓相关联 - 0,1,2和3.使用方法的random_state参数KMeans,我可以修复质心随机初始化的种子,所以始终如一获得归属于同一公寓的相同标签.
然而,由于该特定情况是关于能量消耗,因此可以执行最高和最低消费者之间的可测量分类.因此,我希望将标签0分配给消费水平最低的公寓,将标签1分配给消耗更多的公寓,依此类推.
截至目前,我的标签是[2 1 3 0],或["黑色","绿色","蓝色","红色"]; 我希望他们是[0 1 2 3]或["红色","绿色","黑色","蓝色"].我应该如何继续这样做,同时仍然保持质心初始化随机(使用固定种子)?
非常感谢你的帮助!
Ton*_*has 11
通过查找表转换标签是实现您想要的直接方式.
首先,我生成一些模拟数据:
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
Run Code Online (Sandbox Code Playgroud)
然后我对数据执行聚类:
from sklearn.cluster import KMeans
k = 4
kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
Run Code Online (Sandbox Code Playgroud)
最后我使用NumPy argsort创建一个这样的查找表:
idx = np.argsort(kmeans.cluster_centers_.sum(axis=1))
lut = np.zeros_like(idx)
lut[idx] = np.arange(k)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
idx显示从最低到最高消耗级别排序的群集中心标签.自己的公寓为其中lut[kmeans.labels_]的0/ 3属于具有最低/最高消费水平集群.
| 归档时间: |
|
| 查看次数: |
6216 次 |
| 最近记录: |