为啥 k-means 聚类散点图显示不同的结果?

Posted

技术标签:

【中文标题】为啥 k-means 聚类散点图显示不同的结果?【英文标题】:Why is the k-means clustering scatter plot showing different results?为什么 k-means 聚类散点图显示不同的结果? 【发布时间】:2020-12-23 13:50:46 【问题描述】:

我有两个数据集(data.csv,label.csv)。“label.csv”数据集包含“data.csv”数据集上样本的基因名称。我想在这些数据集中运行 k-means 聚类算法并制作散点图。但我在这方面遇到了困难。下面我给出了我为完成聚类而执行的代码。

import pandas as pd
from sklearn.cluster import KMeans

X = pd.read_csv("data.csv")
Y = pd.read_csv("labels.csv")

#reduce the dimension of X
import time
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder

X = X.dropna()
# drop the first column which only contains strings
X = X.drop(X.columns[X.columns.str.contains('unnamed', case=False)], axis=1)

# label encode the multiple class string into integer values
Y = Y.drop(Y.columns[0], axis=1)
le = LabelEncoder()
le.fit(Y)
class_names = list(le.classes_)

Y = Y.apply(LabelEncoder().fit_transform)
Y_data = Y.values.flatten()

# use TSNE to visualize the high dimension data in 2D
t0 = time.time()
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300, random_state=100)
tsne_results = tsne.fit_transform(X)
t1 = time.time()
print("TSNE took at %.2f seconds" % (t1 - t0))

# visualize TSNE
x_axis = tsne_results[:,0]
y_axis = tsne_results[:,1]

plt.scatter(x_axis, y_axis, c=Y_data, cmap=plt.cm.get_cmap("jet", 100))

plt.colorbar(ticks=range(10))
plt.clim(-0.5, 9.5)
plt.title("TSNE Visualization")
plt.show()

上面的代码给出了我的数据集中 5 个不同类的散点图(如下所示)。类的颜色从 0 到 4(5 个类)不同。

但是当我应用 K-means 聚类代码(如下所示)时,它显示 5 个聚类,但类颜色不是从 0 0 到 4,而是从 0 到 9。散点图图像在 k 表示聚类下方给出代码。

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

model=KMeans(n_clusters=5)
model.fit(tsne_results)
label=model.predict(tsne_results)

#centroid calculation
xs =tsne_results[:,0]
ys =tsne_results[:,1]
plt.scatter(xs,ys,c=Y_data,alpha=0.5)

centroids = model.cluster_centers_
centroids_x = centroids[:,0]
centroids_y = centroids[:,1]

plt.scatter(centroids_x, centroids_y, marker='D', s=50)
plt.colorbar(ticks=range(10))
plt.clim(-0.5, 9.5)
plt.show()

现在,我需要在代码的哪一部分进行更改,以便获得像第一个散点图一样显示 5 个集群从 0 到 4 的彩色类。

【问题讨论】:

如果您将plt.clim(-0.5, 9.5) 更改为例如plt.clim(-0.5, 5.5)? 您在代码中将颜色条刻度范围设置为 9.5(第二个块)...这就是原因。设置为 4.5 【参考方案1】:

我看不出这里有什么问题。您有 5 个不同颜色的簇,我认为这只是 0-9 范围内的颜色,质心是它们自己的颜色。因此,除非您出于某种原因特别需要它们的范围为 0-4,否则我会使用此图。您可以看到集群和质心,这就是您真正需要的。

要查看的代码是

plt.colorbar(ticks=range(10))
plt.clim(-0.5, 9.5)

【讨论】:

以上是关于为啥 k-means 聚类散点图显示不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

K均值算法

3.K均值算法

3.K均值算法

K均值算法

3.K均值算法

3.K均值算法