Как найти кластеры с помощью python?

У меня есть список точек (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 — хороший инструмент, но он требует указания количества кластеров.


person Synal    schedule 10.06.2013    source источник
comment
Я думаю, что это слишком открытый конец. Должны быть некоторые критерии для определения кластера.   -  person mgilson    schedule 10.06.2013


Ответы (2)


1) Чтобы узнать количество кластеров, вы должны определить порог, который сообщит алгоритму, насколько должны различаться два кортежа, прежде чем их можно будет считать принадлежащими к двум разным группам. Например, рассмотрим эти две группы монет: 5 центов и 2 цента, каждая из которых имеет разный вес. Допустим, ваш алгоритм группирует эти монеты по их весу. Может случиться так, что 5-центовые монеты не всегда имеют одинаковый вес (они могут отличаться на 10 миллиграммов или около того), поэтому ваш порог должен быть гибким в этом отношении. Но если две монеты отличаются, скажем, на 1 грамм, то они однозначно принадлежат к двум разным группам. Однако в вашем случае вы можете использовать евклидово расстояние, чтобы найти различия между кортежами. Но определение порога — очень сложная задача, которая может потребовать больших знаний о предметной области. Таким образом, вы можете интуитивно пробовать различные пороговые значения, пока не увидите удовлетворительные результаты.

2) После того, как вы установили количество кластеров, вы можете найти их центры. Центр кластера — это в основном средние значения «x» и «y» всех элементов, принадлежащих этому кластеру. Если вы не знаете, какие элементы принадлежат какому кластеру, вы можете сначала рандомизировать центры кластеров в 2D-пространстве, а затем взять среднее (x, y) элементов, ближайших к этому центру, чтобы получить новый центр. Это то, что делает k-means.

Надеюсь это поможет!!

person Curious    schedule 10.06.2013

Может быть, немного поздновато для вечеринки, но есть хорошее сравнение алгоритмов кластеризации в документации sklearn. Может быть, есть тот, который соответствует вашим потребностям.

person Matt    schedule 19.11.2013