Python 如何从sklearn.cluster.KMeans中提取和映射集群索引?

Python 如何从sklearn.cluster.KMeans中提取和映射集群索引?,python,scikit-learn,k-means,Python,Scikit Learn,K Means,我有一张数据地图: import seaborn as sns import matplotlib.pyplot as plt X = 101_by_99_float32_array ax = sns.heatmap(X, square = True) plt.show() 注意这些数据本质上是一个3D曲面,我对聚类后X中的索引位置感兴趣。我可以轻松地将kmeans算法应用于我的数据: from sklearn.cluster import KMeans # three clusters

我有一张数据地图:

import seaborn as sns
import matplotlib.pyplot as plt

X = 101_by_99_float32_array
ax = sns.heatmap(X, square = True)
plt.show()

注意这些数据本质上是一个3D曲面,我对聚类后
X
中的索引位置感兴趣。我可以轻松地将kmeans算法应用于我的数据:

from sklearn.cluster import KMeans
# three clusters is arbitrary; just used for testing purposes
k_means = KMeans(init='k-means++', n_clusters=3, n_init=10).fit(X)
但我不确定如何导航
kmeans
,以识别上面地图中的像素属于哪个集群。我想做的是绘制一个类似于上面的贴图,但不是绘制100x99数组
X
中每个单元格的z值,而是绘制
X
中每个单元格的群集编号

我不知道kmeans算法的输出是否可以实现这一点,但我确实尝试了scikitlearn文档中的一种方法:

但很明显这不是我想要的信息

很明显,我没有完全理解
kmeans
输出的每个组件所代表的内容,我试图阅读对所发现问题的答案中的解释。然而,在这个答案中没有明确说明聚类后原始数据的索引是否被保留,这是我问题的核心。如果这样的信息通过一些矩阵乘法隐式地出现在
kmeans
中,我真的需要一些帮助来提取它

感谢您的时间和帮助

编辑

感谢@Nakor对kmeans的解释和重塑我的数据的建议。现在,
kmeans
是如何解释我的数据的就更清楚了。我不希望它捕获每个样本的索引,而是依靠
重塑
来实现<代码>重塑将
将原始(101,99)矩阵拉威尔
为(9999,1)数组,正如@Nakor指出的,该数组适合将每个条目作为单个样本进行聚类

只需使用数据的原始形状重新应用
重塑
kmeans.labels
,我就得到了我想要的结果:

Y = X.reshape(-1, 1) # shape data to cluster each individual entry 

kmeans= KMeans(init='k-means++', n_clusters=3, n_init=10)
kmeans.fit(Y)

Z = kmeans.labels_
A = Z.reshape(101,99)

plt.figure()
ax = sns.heatmap(cu_map, square = True)
plt.figure()
ay = sns.heatmap(A, square = True)

您的问题是
sklearn.cluster.KMeans
需要一个包含
[N_示例,N_功能]
的2D矩阵。但是,您提供了原始图像,因此sklearn知道您有101个样本,每个样本具有99个特征(图像的每一行都是样本,而列就是特征)。因此,您在
k\u中得到的意思是。labels\u
是每一行的集群分配

如果您希望对每个条目进行群集,则需要对数据进行如下重塑,例如:

model = KMeans(init='k-means++', n_clusters=3, n_init=10)
model.fit(X.reshape(-1,1))
如果我检查随机生成的数据,我会得到:

In [1]: len(model.labels_)
Out[1]: 9999
我每个条目有一个标签

In [1]: len(model.labels_)
Out[1]: 9999