K 均值聚类不是围绕质心分组

K-means clustering is not grouping around the centroid

我对 ML 和 pandas/scipy 还很陌生,所以请多多包涵。我正在尝试使用 sklearn.cluster KMEANS 模块 运行 K-means 聚类,但我没有从我的聚类中得到预期的结果。

我正在使用的数据集是一个 64 x 6830 的基因组数据矩阵。行是特定的癌细胞系,列是表达值。

我对数据进行了标准化,使得标准差为 1,平均值为 0。

dataframe中,数据是这样的:

                  0         1         2         3         4         5     \
Cancer Types                                                               
CNS           0.728671  1.607220  1.325688  1.355688 -0.604845 -0.220654   
CNS           1.596418  1.753544  0.441686  0.654119  0.911898  1.648748   
CNS           2.190290 -0.016217 -0.349092  0.266465 -1.311310 -0.019322   
RENAL         0.682995 -0.375502  1.628079 -0.444299  1.244434 -0.019322   
BREAST        1.151170 -0.581759  0.965145  1.138767  0.361351 -0.033703   
...                ...       ...       ...       ...       ...       ...   
MELANOMA     -0.024977 -0.601719  0.209168 -0.342761 -0.459396  1.159911   
MELANOMA     -0.573084  0.875343 -0.186266  1.318766  2.117127  0.210772   
MELANOMA      0.523130 -0.788015 -0.302571 -0.924296  0.039286 -1.169792   
MELANOMA     -0.070652  0.223307 -0.163005 -0.859681  0.039286 -0.019322   
MELANOMA      0.842860 -0.322275  0.092864 -0.831988 -1.539873 -0.997222   

这是我用来创建 KMEANS 聚类的 python 代码

vals = standardize.values

from sklearn.cluster import KMeans
km = KMeans(n_clusters=4, n_init=150, random_state=123)
km.fit(vals)

fig, ax = plt.subplots(1, figsize=(14,5))

ax.scatter(vals[:,0], vals[:,1], c = km.labels_, cmap=plt.cm.plasma_r) 
ax.set_title('K-Means Clustering Results with K=4')
ax.scatter(km.cluster_centers_[:,0], km.cluster_centers_[:,1], marker='+', s=100, c='k', linewidth=2)

plt.show()

这是我的结果:

如您所见,我的情节点 none 正确地聚集在质心周围

我认为问题在于您只代表数据的 2 列,而聚类是在原始 space 64 * 6830 中完成的。

所以每个质心都应该是一个 6830 维的向量,但是您在图中只使用了 2 个维度(在您的例子中是基因)。

要绘制您的数据,我建议您使用 PCA 或 UMAP 之类的东西将您的数据投影到可以轻松表示的 2D space 中,而不是应用 k-means。通过这种方式,您的质心将只有 2 个维度,您可以轻松绘制,而且您的样本将由 2 个坐标表示。

此外,高维聚类 space 很复杂,尤其是使用欧氏距离等度量时。因此,在较低维度 space 中向下投影数据应该有助于聚类,而且不仅有利于表示。 使用 PCA,您可以按以下方式向下投影 2D 数据。 其他非线性模型可能会更好地预测数据。

from sklearn.decomposition import PCA
X = vals
Transformed_x = PCA(2).fit_transform(X)

不如像您一样应用 k-means