pascalabcnet/InstallerSamples/MachineLearning/06_Pipelines/04_UMatrixPipeline_KMeans.pas

59 lines
2.3 KiB
ObjectPascal
Raw Permalink Normal View History

// В этом примере показан unsupervised pipeline для матрицы признаков.
//
// Данные сначала извлекаются из DataFrame в матрицу,
// а затем pipeline выполняет масштабирование и кластеризацию.
//
// Это удобно, когда табличная подготовка уже сделана заранее
// и хочется работать сразу с числовой матрицей.
uses MLABC;
begin
var ds := Datasets.RussianCities;
var df := ds.Data;
// Добавляем два полезных числовых признака для кластеризации городов.
df := df.WithColumnFloat('density', row -> row.Float('population') / row.Float('area'));
df := df.WithColumnFloat('log_population', row -> Ln(row.Float('population')));
// Для кластеризации берем два числовых признака:
// логарифм населения и плотность населения.
var features := ['log_population', 'density'];
var X := df.ToMatrix(features);
// Строим matrix pipeline:
// сначала StandardScaler, затем KMeans.
var pipe := MatrixPipeline.BuildClustering(
new StandardScaler,
new KMeans(3, seed := 42)
);
// Обучаем pipeline и получаем метки кластеров.
pipe.Fit(X);
var labels := pipe.Predict(X);
// Добавляем метки кластеров в таблицу,
// чтобы потом удобно вывести представителей каждого кластера.
df.AddIntColumn('cluster', labels, nil);
Println('Кластеризация городов с помощью UMatrixPipeline');
Println;
Println('Используются признаки log_population и density.');
Println('Для каждого кластера выводятся самые крупные города.');
Println;
for var cluster := 0 to 2 do
begin
Println($'Кластер {cluster + 1}:');
var clusterDf := df
.Filter(r -> r.Int('cluster') = cluster)
.SortBy('population', descending := True)
.Select(['city', 'population', 'density'])
.Head(5);
clusterDf.Print;
Println;
end;
end.