K意味着在不均匀大小的簇上聚类

时间:2017-01-24 09:35:00

标签: python scikit-learn k-means

我必须在数据集上使用k表示聚类(我正在使用Scikit学习),如下所示enter image description here

但是当我应用K意味着它并没有像我们预期的那样给我质心。并且分类不正确。 如果我想知道在scikit学习中没有正确分类的要点,那么会有什么想法。 这是代码。

  header.container {
    overflow: visible;
    z-index: 2;
    position: relative // without this sometime z-index doesnt work 
}

这里Train_data是pandas框架,有2个功能和3500个样本,代码给出了以下内容。

enter image description here

我可能因为初始质心选择不当而发生了什么,但可能是什么解决方案呢?

2 个答案:

答案 0 :(得分:1)

首先,我希望您注意到X和Y轴上的范围在两个图中都不同。所以,第一个质心(按X值排序)并没有那么糟糕。由于存在大量异常值,因此获得了第二个和第三个。他们可能每个都占据最右边的一半。此外,k-means的输出取决于质心的初始选择,因此请查看不同的运行或将init参数设置为随机可以改善结果。提高效率的另一种方法是去除距离d的半径内具有少于n个邻居的所有点。为了有效地实现这一点,您可能需要一个kd树,或者只需使用sklearn提供的DBSCAN,看看它是否更好。

K-Means ++也可能选择异常值作为初始集群,如here所述。因此,您可能希望将KMeans中的init参数更改为“随机”并执行多次运行并获取最佳质心。

对于您的数据,因为它是2-D,很容易知道点是否被正确分类。使用鼠标“拾取”近似质心的坐标(参见here),然后将从拾取坐标获得的聚类与从k-means获得的聚类进行比较。

答案 1 :(得分:1)

我得到了一个解决方案。 问题是缩放。 我只是使用

缩放了两个轴
sklearn.preprocessing.scale

这是我的结果 enter image description here