在 python 中使用 kmeans sklearn 对数据点进行聚类

Posted

技术标签:

【中文标题】在 python 中使用 kmeans sklearn 对数据点进行聚类【英文标题】:Cluster datapoints using kmeans sklearn in python 【发布时间】:2018-06-14 23:28:15 【问题描述】:

我正在使用以下 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-sne
X = TSNE(n_components=2).fit_transform( data )

fig = plt.figure(1)
plt.clf()

#plot graph
colors = 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 vales如下。

[[  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]]

【问题讨论】:

您查看过 t-SNE 变换后 X 的值吗? 我无法重现您的问题。根据给出的示例数据,我得到 5 分,x 和 y 值(大约)在 -200 和 200 之间。您使用的是什么 sklearn 和 numpy 版本? @Evert 非常感谢您的 cmets。我的 numpy 版本是 1.13.0,sklearn 版本是 0.18.1。另外,我在问题中更新了我的 tsne 值。你能告诉我我在哪里弄错了代码吗? 无法使用 numpy 1.13.3 和 sklearn 0.19 进行复制 在 0.19 版中为 manifold.TSNE 修复了很多错误。尝试升级您的sklearn 版本。 【参考方案1】:

使用TSNEperplexity 参数。 perplexity 的默认值为 30,这对于您的情况来说似乎太多了,即使文档指出 TSNE 对此参数非常不敏感。

困惑度与其他流形学习算法中使用的最近邻的数量有关。更大的数据集通常需要更大的困惑度。考虑选择一个介于 5 和 50 之间的值。选择不是非常关键,因为 t-SNE 对这个参数非常不敏感。

X = TSNE(n_components=2, perplexity=2.0).fit_transform( data )

【讨论】:

非常感谢。您在我的代码中看到任何其他缺陷吗? :) 我没有,其他部分还可以。【参考方案2】:

您还可以使用 PCA(主成分分析)而不是 t-SNE 来绘制集群:

import numpy as np
import pandas as pd  
from sklearn.cluster import Kmeans
from sklearn.decomposition import PCA

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 = KMeans(n_clusters = 3)
labels = kmeans.fit_predict(data)    

pca = PCA(n_components=2)
data_reduced = pca.fit_transform(data)
data_reduced = pd.DataFrame(data_reduced)

ax = data_reduced.plot(kind='scatter', x=0, y=1, c=labels, cmap='rainbow')
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_title('Projection of the clustering on a the axis of the PCA')

for x, y, label in zip(data_reduced[0], data_reduced[1], kmeans.labels_):
    ax.annotate('Cluster 0'.format(label), (x,y))

【讨论】:

以上是关于在 python 中使用 kmeans sklearn 对数据点进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

Python:导入KMeans库失败;Kmeans报错及解决方法;NameError: name ‘KMeans‘ is not defined

如何在 python 中的 KMeans 聚类中获得 X 值?

python 使用kmeans聚类从图像中检测主色

在 Python 中为每次迭代绘制 KMeans 聚类中心

Python训练Kmeans算法预测图像的主色

Python:加载 kmeans 训练数据集并使用它来预测新数据集