Вы можете использовать иерархическую кластеризацию. Это довольно простой подход, поэтому существует множество его реализаций. Например, он включен в scipy Python.
См., Например, следующий сценарий:
import matplotlib.pyplot as plt
import numpy
import scipy.cluster.hierarchy as hcluster
# generate 3 clusters of each around 100 points and one orphan point
N=100
data = numpy.random.randn(3*N,2)
data[:N] += 5
data[-N:] += 10
data[-1:] -= 20
# clustering
thresh = 1.5
clusters = hcluster.fclusterdata(data, thresh, criterion="distance")
# plotting
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:
Чтобы получить хороший обзор этих и других алгоритмов кластеризации, также посмотрите эту демонстрационную страницу (библиотеки Python scikit-learn):
Изображение скопировано с этого места:

Как видите, каждый алгоритм делает некоторые предположения о количестве и форме кластеров, которые необходимо учитывать. Будь то неявные предположения, налагаемые алгоритмом, или явные предположения, определенные параметризацией.
person
moooeeeep
schedule
13.04.2012
DBSCANв Википедии. - person Has QUIT--Anony-Mousse   schedule 14.04.2012DBSCANс примером использования: scikit-learn .org / стабильный / модули / сгенерированный / - person Jean Monet   schedule 28.04.2021