K均值聚类,使质心不与节点重叠

时间:2014-03-24 15:43:01

标签: python cluster-analysis k-means

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

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

一个质心可能太靠近几个节点。

关于如何取代质心的任何建议?

非常感谢。

例如,要聚类的节点是 MyNodes = [[469500,5802610],[468764,5803422],[467991,5804202],[470260,5799949],[469486,5800730],[468713,5801510],[467939,5802291],[467166,5803072] [467966,5800204],[467193,58001785],[466420,5801766],[466457,5799700],[465678,5800488],[464950,5799229],[470615,5796600],[469842,5797405],[ 470320,5794955],[469547,5795735],[468773,5796516],[467990,5797297],[470062,5793215],[469289,5793996],[468515,5794776],[467742,5795557],[466969, 5796338],[466195,5797119],[469976,5791334],[469202,5792115],[468429,5792896],[467656,5793676],[466882,5794457],[466109,5795238],[465336,5796050] [464600,5796840],[470160,5789250],[469354,5789972],[468581,5790753],[467808,5791534],[467034,57921515],[466261,5793096],[465488,5793877],[ 464714​​,5794658],[463941,5795499],[463150,5796210],[469500,5787920],[468698,5788614],[467925,5789395],[467152,5790176]]

Centroids = [[467839.6,5793224.1],[467617.22222222,5800489.94444444]] Centroid [0]太靠近节点[29],Centroid 1太靠近节点[8]。enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,而且我完全不确定是否这样做,那么解决方案已经从你的图纸中显而易见了:

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

  • 围绕每个节点绘制一个圆,最小距离为半径
  • 将每个圆与彼此相交,记下交点
  • 丢弃任何比节点的最小距离更近的交叉点。
  • 从剩余的交叉点,取最接近质心点的那个。那是你新的流离失所的质心。

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

这应该是最佳解决方案;无论你使用哪种算法,你都找不到更接近最小距离约束的原始质心的点;并且这个算法应该总能找到最佳点。

虽然质心通常被节点包围,但如果节点密集,新点可能相距一段距离。