我有一个点列表(x,y,pointNo)例如:
[(344, 279, 0), (344, 276, 1), (342, 267, 2), (349, 259, 3), (348, 279, 4), (339, 268, 5), (343, 277, 6), (336, 275, 7), (344, 262, 8), (346, 269, 9), (279, 292, 10), (287, 287, 11), (278, 294, 12), (273, 294, 13), (280, 296, 14), (273, 291, 15), (287, 284, 16), (273, 292, 17), (273, 282, 18), (279, 296, 19), (210, 221, 20), (196, 230, 21), (191, 216, 22), (211, 221, 23), (192, 217, 24), (195, 230, 25), (192, 214, 26), (208, 225, 27), (206, 217, 28), (206, 224, 29), (176, 104, 30), (174, 114, 31), (180, 96, 32), (174, 103, 33), (171, 110, 34), (185, 114, 35), (179, 114, 36), (188, 100, 37), (183, 112, 38), (190, 115, 39), (274, 67, 40), (260, 62, 41), (264, 65, 42), (277, 78, 43), (274, 65, 44), (272, 75, 45), (260, 64, 46), (263, 68, 47), (259, 79, 48), (270, 64, 49), (344, 136, 50), (355, 129, 51), (344, 132, 52), (340, 122, 53), (348, 125, 54), (341, 136, 55), (343, 119, 56), (350, 136, 57), (348, 116, 58), (339, 135, 59), (213, 281, 60), (143, 211, 61), (125, 130, 62), (138, 241, 63), (350, 195, 64), (374, 189, 65), (362, 180, 66), (364, 187, 67), (375, 177, 68), (362, 187, 69), (364, 171, 70), (366, 180, 71), (366, 176, 72), (372, 178, 73), (366, 188, 74), (125, 132, 75), (125, 127, 76), (136, 140, 77), (120, 122, 78), (129, 134, 79), (124, 131, 80), (125, 138, 81), (128, 139, 82), (134, 124, 83), (123, 138, 84)]
如何在不给出群集数量的情况下搜索并将其划分为群集。我的第二个问题是如何获得每个集群的中心。
我发现kmeans是一个不错的工具,但它需要给出簇数值。
答案 0 :(得分:2)
也许派对有点晚了,但是在sklearn文档中有一个nice comparison of clustering algorithms。也许有一个适合您的需求。
答案 1 :(得分:1)
1)要知道群集的数量,您必须定义一个阈值,该阈值将告诉算法两个元组在被认为属于两个不同的组之前必须有多少差异。例如,考虑这两组硬币:5美分和2美分,这样每个硬币都有不同的重量。假设您的算法根据权重对这些硬币进行聚类。可能会发生5美分硬币并不总是具有相同的重量(它们可能相差10毫克左右),因此在这方面你的门槛应该是灵活的。但是,如果两个硬币相差1克,那么肯定它们属于两个不同的群体。但是,在您的情况下,您可以使用欧几里德距离来查找元组之间的差异。但提出阈值是一项非常具有挑战性的任务,可能需要大量有关问题域的知识。因此,您可以直观地尝试不同的阈值,直到您看到令人满意的结果。
2)一旦设置了群集数量,就可以找到他们的中心。群集的中心基本上是属于该群集的所有元素的平均“x”和“y”值。如果您不知道哪些元素属于哪个群集,则可以先在2D空间中随机化群集中心,然后获取最接近该中心的元素的平均值(x,y),以获得新的中心。这就是k-means的作用。
希望这会有所帮助!!