我使用以下Python代码对我的数据点进行kmeans聚类。
data = np.array([[30, 17, 10, 32, 32], [18, 20, 6, 20, 15], [10, 8, 10, 20, 21], [3, 16, 20, 10, 17], [3, 15, 21, 17, 20]])kmeans_clustering = KMeans( n_clusters = 3 )idx = kmeans_clustering.fit_predict( data )#use t-sneX = TSNE(n_components=2).fit_transform( data )fig = plt.figure(1)plt.clf()#plot graphcolors = np.array([x for x in 'bgrcmykbgrcmykbgrcmykbgrcmyk'])plt.scatter(X[:,0], X[:,1], c=colors[kmeans_clustering.labels_])plt.title('K-Means (t-SNE)')plt.show()
然而,我得到的聚类图显示所有点都集中在一个点上。
因此,请告诉我我的代码哪里出错了?我希望在散点图中能看到kmeans聚类分开显示。
编辑
我得到的t-sne值如下。
[[ 1.12758575e-04 9.30458337e-05] [ -1.82559784e-04 -1.06657936e-04] [ -9.56485652e-05 -2.38951623e-04] [ 5.56515580e-05 -4.42453191e-07] [ -1.42039677e-04 -5.62548119e-05]]
回答:
使用TSNE
的perplexity
参数。默认的perplexity
值为30,看来对于你的情况来说这个值太大了,尽管文档中提到TSNE
对这个参数不太敏感。
perplexity与其他流形学习算法中使用的最近邻居数量有关。较大的数据集通常需要更大的perplexity。考虑选择5到50之间的值。这个选择并不是非常关键,因为t-SNE对这个参数不太敏感。
X = TSNE(n_components=2, perplexity=2.0).fit_transform( data )