Ви можете використовувати ієрархічну кластеризацію . Це досить базовий підхід, тому існує безліч реалізацій. Він, наприклад, включений до Python's scipy .
Дивіться, наприклад, такий сценарій:
import matplotlib.pyplot as plt
import numpy
import scipy.cluster.hierarchy as hcluster
N=100
data = numpy.random.randn(3*N,2)
data[:N] += 5
data[-N:] += 10
data[-1:] -= 20
thresh = 1.5
clusters = hcluster.fclusterdata(data, thresh, criterion="distance")
plt.scatter(*numpy.transpose(data), c=clusters)
plt.axis("equal")
title = "threshold: %f, number of clusters: %d" % (thresh, len(set(clusters)))
plt.title(title)
plt.show()
Що дає результат, подібний до наступного зображення.
Поріг, вказаний як параметр, є значенням відстані, на основі якого приймається рішення, чи точки / кластери будуть об'єднані в інший кластер. Також можна вказати метрику відстані, яка використовується.
Зверніть увагу, що існують різні методи для обчислення подібності всередині / між кластерами, наприклад відстань між найближчими точками, відстань між найвіддаленішими точками, відстань до центрів кластера тощо. Деякі з цих методів також підтримуються модулем ієрархічної кластеризації scipys ( одинарний / повний / середній ... зв’язок ). Відповідно до Вашого допису, я думаю, Ви хотіли б використовувати повний зв'язок .
Зверніть увагу, що цей підхід також дозволяє малими (одноточковими) кластерами, якщо вони не відповідають критерію подібності інших кластерів, тобто пороговій відстані.
Існують інші алгоритми, які будуть працювати ефективніше, що стане актуальним у ситуаціях з великою кількістю точок даних. Як припускають інші відповіді / коментарі, ви можете також поглянути на алгоритм DBSCAN:
Для гарного огляду цих та інших алгоритмів кластеризації також загляньте на цю демонстраційну сторінку (бібліотеки scikit-learn від Python):
Зображення скопійовано з цього місця:
Як бачите, кожен алгоритм робить деякі припущення щодо кількості та форми кластерів, які потрібно враховувати. Будь то неявні припущення, нав'язані алгоритмом, або явні припущення, задані параметризацією.
DBSCAN
на Вікіпедію.