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
我对 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