Heuristi c для настройки параметров Epsilon и MinPts было предложено в оригинальной бумаге DBSCAN
После установки значения MinPts (например, 2 * Количество функций) результат разбиения сильно зависит от Epsilon. Heuristi c предлагает вывести эпсилон с помощью визуального анализа графика k-dist .
Игрушечный пример процедуры с двумя гауссовыми распределениями представлен ниже.
from sklearn.neighbors import NearestNeighbors
from matplotlib import pyplot as plt
from sklearn.datasets import make_biclusters
data,lab,_ = make_biclusters((200,2), 2, noise=0.1, minval=0, maxval=1)
minpts = 4
nbrs = NearestNeighbors(n_neighbors=minpts, algorithm='ball_tree').fit(data)
distances, indices = nbrs.kneighbors(data)
k_dist = [x[-1] for x in distances]
f,ax = plt.subplots(1,2,figsize = (10,5))
ax[0].set_title('k-dist plot for k = minpts = 4')
ax[0].plot(sorted(k_dist))
ax[0].set_xlabel('object index after sorting by k-distance')
ax[0].set_ylabel('k-distance')
ax[1].set_title('original data')
ax[1].scatter(data[:,0],data[:,1],c = lab[0])
В результирующем графике k-dist "колено" теоретически разделяет объекты шума от объектов кластера и действительно дает указание на вероятный диапазон значений для Epsilon (с учетом набора данных в сочетании с выбранным значением MinPts). В этом примере с игрушкой я бы сказал, что от 0,05 до 0,075.