K 表示在不均匀大小的簇上进行聚类
Posted
技术标签:
【中文标题】K 表示在不均匀大小的簇上进行聚类【英文标题】:K means clustering on unevenly sized clusters 【发布时间】:2017-06-09 01:01:32 【问题描述】:我必须在数据集上使用 k 均值聚类(我正在使用 Scikit 学习),看起来像这样
但是当我应用 K 意味着它没有给我预期的质心。并且分类错误。 如果我想知道在 scikit learn 中没有正确分类的点,还有什么想法。 这是代码。
km = KMeans(n_clusters=3, init='k-means++', max_iter=300, n_init=10)
km.fit(Train_data.values)
plt.plot(km.cluster_centers_[:,0],km.cluster_centers_[:,1],'ro')
plt.show()
这里的 Train_data 是 pandas 框架,具有 2 个特征和 3500 个样本,代码如下。
我可能是因为初始质心选择不当而发生的,但解决办法是什么?
【问题讨论】:
请提供您的代码。 @Farseer 我已经添加了。 【参考方案1】:我有一个解决方案。 问题是缩放。 我只是使用
缩放了两个轴sklearn.preprocessing.scale
这是我的结果
【讨论】:
【参考方案2】:首先,我希望您注意到两个图中 X 轴和 Y 轴的范围不同。所以,第一个质心(按 X 值排序)还不错。第二个和第三个是由于大量异常值而获得的。他们可能各自占据了两个最右边集群的一半。此外,k-means 的输出取决于质心的初始选择,因此请查看不同的运行或将 init 参数设置为随机是否会改善结果。提高效率的另一种方法是删除距离 d 半径内具有少于 n 个邻居的所有点。为了有效地实现这一点,您可能需要一个 kd-tree,或者只使用 sklearn 提供的DBSCAN 看看它是否工作得更好。
K-Means++ 也可能会选择异常值作为初始集群,如 here 所述。因此,您可能希望将 KMeans 中的 init 参数更改为“随机”并执行多次运行并获取最佳质心。
对于您的数据,因为它是二维的,所以很容易知道点是否被正确分类。使用鼠标“拾取”近似质心的坐标(请参阅here),然后将拾取坐标获得的聚类与从 k-means 获得的聚类进行比较。
【讨论】:
尝试了一切。甚至尝试显式设置初始质心。给出相同的结果。 如果你明确地设置了初始集群并且仍然得到相同的答案,那么这是由于离群值,因为k-means对离群值敏感,所以什么都做不了。您将不得不使用其他聚类算法,如 DBSCAN、SLINK(Heirarchical)等,或者如果您必须使用 k-means 通过使用我在答案中建议的方法删除异常值来修改数据以上是关于K 表示在不均匀大小的簇上进行聚类的主要内容,如果未能解决你的问题,请参考以下文章