为啥 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 聚类散点图显示不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章