1

我有一个点列表(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 是一个不错的工具,但它需要给出簇数的值。

4

2 回答 2

3

聚会可能有点晚了,但是在 sklearn 文档中有一个很好的聚类算法比较。也许有一个适合您的需求。

于 2013-11-19T13:01:30.437 回答
1

1)要知道集群的数量,您必须定义一个阈值,该阈值将告诉算法两个元组必须相差多少才能被视为属于两个不同的组。例如,考虑这两组硬币:5 美分和 2 美分,这样它们中的每一个都有不同的重量。假设您的算法根据它们的权重对这些硬币进行聚类。5 美分硬币的重量可能并不总是相同(它们可能相差 10 毫克左右),因此您的阈值在这方面应该是灵活的。但是,假设两个硬币相差 1 克,那么它们肯定属于两个不同的组。但是,在您的情况下,您可以使用欧几里得距离来查找元组之间的差异。但是提出阈值是一项非常具有挑战性的任务,可能需要大量有关问题域的知识。因此,您可以直观地尝试不同的阈值,直到看到满意的结果。

2)一旦你设置了集群的数量,你就可以找到它们的中心。集群的中心基本上是属于该集群的所有元素的平均“x”和“y”值。如果不知道哪些元素属于哪个簇,可以先在 2D 空间中随机化簇中心,然后取离该中心最近的元素的平均值 (x,y),以获得新的中心。这就是 k-means 所做的。

希望这可以帮助!!

于 2013-06-10T12:49:21.867 回答