39 lines
1,001 B
ObjectPascal
39 lines
1,001 B
ObjectPascal
uses MLABC, PlotML;
|
|
|
|
begin
|
|
var ds := Datasets.RussianCities;
|
|
var df := ds.Data;
|
|
|
|
// --- признаки
|
|
df := df.WithColumnFloat('density', row -> row.Float('population') / row.Float('area'));
|
|
df := df.WithColumnInt('age', row -> 2026 - row.Int('foundation_year'));
|
|
df := df.WithColumnFloat('log_population', row -> Ln(row.Float('population')));
|
|
|
|
var features := ['log_population', 'density', 'lat', 'lon'{, 'age'}];
|
|
|
|
// --- кластеризация
|
|
var X := df.ToMatrix(features);
|
|
|
|
var km := new KMeans(5, seed := 42);
|
|
km.Fit(X);
|
|
|
|
var labels: array of integer := km.Predict(X);
|
|
df.AddIntColumn('cluster', labels, nil);
|
|
|
|
// --- координаты
|
|
var lon := df.ToVector('lon').ToArray;
|
|
var lat := df.ToVector('lat').ToArray;
|
|
|
|
Plot.Points(
|
|
lon,
|
|
lat,
|
|
labels,
|
|
size := 5,
|
|
marker := MarkerType.Circle
|
|
);
|
|
|
|
Plot.XLabel := 'Долгота';
|
|
Plot.YLabel := 'Широта';
|
|
Plot.Title := 'Кластеры городов России';
|
|
end.
|