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

59 lines
2.3 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// В этом примере показан 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.