【问题标题】:K-mean clustering, make centroids not overlap nodesK-mean聚类,使质心不重叠节点
【发布时间】:2014-05-02 01:59:46
【问题描述】:

我已经按照http://datasciencelab.wordpress.com/2014/01/15/improved-seeding-for-clustering-with-k-means/中给出的方法,使用Python 2.7完成了K-mean++聚类并获得了聚类的质心

在我的问题中,还有一个进一步的限制,即任何质心到任何节点的距离都应该大于一个常数。实现的最佳方法是什么?

一个质心可能离多个节点太近。

关于如何稍微移动质心的任何建议?

非常感谢。

例如,要集群的节点是 MyNodes = [[469500, 5802610], [468764, 5803422], [467991, 5804202], [470260, 5799949], [469486, 5800730], [468713, 5801510], [4618,3046, 72]6,99,58022 , [467966, 5800204], [467193, 5800985], [466420, 5801766], [466457, 5799700], [465678, 5800488], [464950, 5799229], [470615, 579, 570], [469], [470615, 5796600] [469396] 579396(5793907 [469367] 57930375,57930605,5793096 , [464600, 5796840], [470160, 5789250], [469354, 5789972], [468581, 5790753], [467808, 5791534], [467034, 5792315], [466261, 579309], [8474, [8,576] 464714​​, 5794658], [463941, 5795499], [463150, 5796210], [469500, 5787920], [468698, 5788614], [467925, 5789395], [467152, 5790176]]

质心 = [[ 467839.6, 5793224.1], [ 467617.22222222, 5800489.94444444]] Centroid[0] 离节点[29] 太近,Centroid1 离节点[8] 太近。

【问题讨论】:

  • 你说质心不应该比常数更接近节点,在你的情况下这个常数是什么?此外,如果常数足够大,则可能无法解决,或者即使“质心”的位置可能不再是真正的质心。
  • 在示例中,常数为 500。
  • 这背后的动机是什么?坦率地说,我的猜测是你误解了一些东西。也许质心到任何其他质心的距离必须大于那个常数?
  • 目前您的问题似乎没有很好的定义,而且似乎很难。如果您告诉我们您的最终目标可能会有所帮助,因为可能会有更简单的解决方案。质心靠近节点有什么问题?
  • 任何质心到任何节点的距离应该大于一个常数(它们不能太近)

标签: python cluster-analysis k-means


【解决方案1】:

如果我正确理解了您的问题,但我完全不确定自己是否正确理解,那么解决方案已经从您的图纸中显而易见:

您想要最接近给定质心点的点;并且与一组节点的距离最小。

  • 围绕每个节点点画一个圆,以最小距离为半径
  • 将每个圆与其他圆相交,注意交点
  • 丢弃任何比到节点点的最小距离更近的交点。
  • 从剩余的交点中,取离质心点最近的一个。那是你新的位移质心。

幼稚实现的运行时间应该是O(number_of_nodes^2),尽管您可以通过使用一些快速的最近邻查找数据结构(例如 kd-tree)来优化它,当您与圆相交并丢弃太关闭。

这应该是最优解;无论您使用哪种算法,您都无法找到更接近原始质心的符合最小距离约束的点;而且这个算法应该总能找到那个最佳点。

虽然由于质心一般都被结点包围,但如果结点密集,新点可能会相距相当远。

【讨论】:

  • 是的,我刚刚在发布问题后找到了解决方案。还是谢谢你的回复。
  • 您是否介意揭示这个附加约束背后的实际案例或稍微概括的版本?
猜你喜欢
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2015-07-29
  • 2016-05-29
  • 2017-09-24
  • 2018-09-19
  • 1970-01-01
相关资源
最近更新 更多