2026-05-07 22:53:13 +03:00
|
|
|
|
// В этом примере подбирается параметр eps для DBSCAN.
|
|
|
|
|
|
//
|
|
|
|
|
|
// eps задаёт радиус окрестности точки.
|
|
|
|
|
|
// Если eps слишком мал, алгоритм считает много точек шумом.
|
|
|
|
|
|
// Если eps слишком велик, разные группы могут слиться в один кластер.
|
|
|
|
|
|
|
|
|
|
|
|
uses MLABC;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
var (X, yTrue) := Datasets.MakeMoons(
|
|
|
|
|
|
n := 400,
|
|
|
|
|
|
noise := 0.08,
|
|
|
|
|
|
shuffle := True,
|
|
|
|
|
|
seed := 1
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
Println('Подбор параметра eps для DBSCAN');
|
|
|
|
|
|
Println;
|
|
|
|
|
|
Println('eps кластеры шум ARI');
|
|
|
|
|
|
Println('-' * 34);
|
|
|
|
|
|
|
|
|
|
|
|
foreach var eps in [0.10, 0.14, 0.18, 0.22, 0.26, 0.30] do
|
|
|
|
|
|
begin
|
|
|
|
|
|
var model := new DBSCAN(eps, 5);
|
2026-05-28 10:23:22 +03:00
|
|
|
|
var labels := model.FitPredict(X);
|
2026-05-07 22:53:13 +03:00
|
|
|
|
|
|
|
|
|
|
var noiseCount := 0;
|
|
|
|
|
|
foreach var clusterLabel in labels do
|
|
|
|
|
|
if clusterLabel = -1 then
|
|
|
|
|
|
noiseCount += 1;
|
|
|
|
|
|
|
|
|
|
|
|
var ari := ClusteringMetrics.AdjustedRandIndex(yTrue, labels);
|
|
|
|
|
|
|
|
|
|
|
|
Println($'{eps,4:F2} {model.ClustersCount,10} {noiseCount,6} {ari,8:F3}');
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
Println;
|
|
|
|
|
|
Println('Интерпретация результата:');
|
|
|
|
|
|
Println('- При слишком маленьком eps шумовых точек становится слишком много.');
|
|
|
|
|
|
Println('- При слишком большом eps разные группы могут сливаться.');
|
|
|
|
|
|
Println('- Хороший eps даёт разумное число кластеров и высокое значение ARI.');
|
|
|
|
|
|
end.
|