使用 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”有啥区别?
聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用