使用 sklearn.cluster 进行 K 均值聚类

Posted

技术标签:

【中文标题】使用 sklearn.cluster 进行 K 均值聚类【英文标题】:K-means clustering using sklearn.cluster 【发布时间】:2016-03-10 21:18:57 【问题描述】:

我在Unsupervised Machine Learning: Flat Clustering 上看到了这个关于 K-means 聚类的教程,下面是代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")

from sklearn.cluster import KMeans

X = np.array([[1,2],[5,8],[1.5,1.8],[1,0.6],[9,11]])

kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

centroid = kmeans.cluster_centers_
labels = kmeans.labels_

print (centroid)
print(labels)

colors = ["g.","r.","c."]

for i in range(len(X)):
   print ("coordinate:" , X[i], "label:", labels[i])
   plt.plot(X[i][0],X[i][1],colors[labels[i]],markersize=10)

plt.scatter(centroid[:,0],centroid[:,1], marker = "x", s=150, linewidths = 5, zorder =10)

plt.show()

在这个例子中,数组只有 [1,2],[5,8],[1.5,1.8] 等 2 个特征。

我尝试将X 替换为存储在np.array() 中的10 x 750 矩阵(750 个特征)。 它创建的图表没有任何意义。

我怎样才能改变上面的代码来解决我的问题?

【问题讨论】:

嗯,您正在对 750 维数据进行聚类并仅可视化前两个维度。可以预料,结果没有多大意义。 10 个事件,每个事件有 750 个特征?在您没有做出像样的特征选择/特征生成之前,您不会对其进行分类。您认为如何在 750 维空间中聚集 10 个点?这不会发生。 【参考方案1】:

可视化 750 维很难。

弄清楚独立的k-means如何可视化。

但不要指望 k-means 会在此类数据上返回有意义的结果...它对预处理和归一化非常敏感,而且很可能您的 750 个维度不在完全相同的连续数值尺度上。

【讨论】:

【参考方案2】:

实际上,直接可视化 750 维数据是不可能的。

但是还有其他方法可以解决,例如,首先使用PCA 将维度减少到一个非常低的维度,例如 4。Scikit-learn 还提供了一个function for this。

然后你可以绘制一个 plot 矩阵,每个 plot 只有两个特征。使用Pandas 包,您可以使用scatter_matrix 函数非常轻松地绘制这些图。

请注意,在您仅使用 PCA 进行可视化的情况下,您仍应在获取质心后对原始数据进行 K-means 聚类,然后使用您之前创建的 PCA 模型对质心进行 PCA。

这是由scatter_matrix 函数创建的示例图:

【讨论】:

scatter_matrix 不再受支持。您可以在替换中使用 Seaborn,只需执行 import seaborn as sns 之类的简单操作,然后创建您的数据框,然后执行 sns.pairplot(df) 来创建与此答案类似的视觉效果。效果很好。

以上是关于使用 sklearn.cluster 进行 K 均值聚类的主要内容,如果未能解决你的问题,请参考以下文章

当我应该使用其中之一时,“sklearn.cluster.k_means”和“sklearn.cluster.KMeans”有啥区别?

使用sklearn进行K_Means聚类算法

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用